aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--changelog.md6
-rw-r--r--demo/dist/demo.css2
-rw-r--r--demo/dist/demo.js474
-rw-r--r--demo/dist/demo.js.map2
-rw-r--r--demo/dist/demo.min.js2
-rw-r--r--demo/dist/demo.min.js.map2
-rw-r--r--dist/plyr.css2
-rw-r--r--dist/plyr.js13490
-rw-r--r--dist/plyr.js.map2
-rw-r--r--dist/plyr.min.js2
-rw-r--r--dist/plyr.min.js.map2
-rw-r--r--dist/plyr.polyfilled.js23671
-rw-r--r--dist/plyr.polyfilled.js.map2
-rw-r--r--dist/plyr.polyfilled.min.js2
-rw-r--r--dist/plyr.polyfilled.min.js.map2
-rw-r--r--dist/plyr.svg2
-rw-r--r--package.json2
-rw-r--r--readme.md8
-rw-r--r--src/js/plyr.js2
-rw-r--r--src/js/plyr.polyfilled.js2
20 files changed, 16647 insertions, 21032 deletions
diff --git a/changelog.md b/changelog.md
index 8739e527..b12363c1 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,9 @@
+# v3.4.4
+
+- Fixed issue with double binding for `click` and `touchstart` for `clickToPlay` option
+- Improved "faux" fullscreen on iPhone X/XS phones with notch
+- Babel 7 upgrade (which reduced the polyfilled build by ~10kb!)
+
# v3.4.3
- Fixed issue with nodeList for custom playback controls
diff --git a/demo/dist/demo.css b/demo/dist/demo.css
index c792f38b..c9a26174 100644
--- a/demo/dist/demo.css
+++ b/demo/dist/demo.css
@@ -1 +1 @@
-@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:300;src:url(https://cdn.plyr.io/static/fonts/gordita-light.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-light.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:400;src:url(https://cdn.plyr.io/static/fonts/gordita-regular.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-regular.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:500;src:url(https://cdn.plyr.io/static/fonts/gordita-medium.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-medium.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:600;src:url(https://cdn.plyr.io/static/fonts/gordita-bold.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-bold.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:900;src:url(https://cdn.plyr.io/static/fonts/gordita-black.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-black.woff) format("woff")}@keyframes fadein{0%{opacity:0}100%{opacity:1}}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a,button.faux-link{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}*,::after,::before{box-sizing:border-box}body,html{display:flex;width:100%}html{background:linear-gradient(to left top,#4dc1ff,#0074b3);background-attachment:fixed;height:100%}body{align-items:center;display:flex;flex-direction:column;min-height:100%}.grid{flex:1;overflow:auto}main{margin:auto;padding-bottom:1px;text-align:center}aside{align-items:center;background:#fff;color:#55646b;display:flex;flex-shrink:0;justify-content:center;padding:15px;position:relative;text-align:center;text-shadow:none;width:100%}aside .icon{fill:#4baaf4;margin-right:10px}aside p{margin:0}aside a,aside button.faux-link{color:#4baaf4}aside a.tab-focus,aside button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(75,170,244,.35);outline:0}.grid{margin:0 auto;padding:20px}@media only screen and (min-width:768px){.grid{align-items:center;display:flex;max-width:1260px;width:100%}.grid>*{flex:1}}html{font-size:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-size:15px;font-size:.9375rem;color:#fff;font-family:Gordita,Avenir,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-weight:500;line-height:1.75;text-shadow:0 1px 1px rgba(0,0,0,.15)}button,input,select,textarea{font:inherit}p,small{margin:0 0 20px}small{font-size:13px;font-size:.8125rem;display:block}h1{font-size:64px;font-size:4rem;font-weight:600;letter-spacing:-.025em;line-height:1.2;margin:0 0 20px}.button,.button__count{align-items:center;background:#fff;border:0;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);color:#55646b;display:inline-flex;padding:15px;position:relative;text-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.button{font-weight:600;padding-left:20px;padding-right:20px;transition:all .2s ease}.button:focus,.button:hover{color:#343f4a}.button:focus::after,.button:hover::after{display:none}.button:hover{box-shadow:0 2px 2px rgba(0,0,0,.1);transform:translateY(-1px)}.button:focus{outline:0}.button.tab-focus{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}.button:active{transform:translateY(1px)}.button--with-count{display:inline-flex}.button--with-count .button .icon{flex-shrink:0}.button__count{animation:fadein .2s ease;margin-left:10px}.button__count::before{border:5px solid transparent;border-left-width:0;border-right-color:#fff;content:'';height:0;position:absolute;right:100%;top:50%;transform:translateY(-50%);width:0}header{padding-bottom:20px;text-align:center}header .call-to-action{margin-top:30px}@media only screen and (min-width:768px){header{margin-right:60px;max-width:360px;padding-bottom:40px;text-align:left}}.icon{fill:currentColor;height:16px;vertical-align:-3px;width:16px}a svg,button svg,button.faux-link svg,label svg{pointer-events:none}.btn .icon,a .icon,button.faux-link .icon{margin-right:6px}button.faux-link{background:0 0;border:0;border-radius:0;cursor:pointer;font:inherit;line-height:1.75;margin:0;padding:0;position:relative;text-align:inherit;text-shadow:inherit;-moz-user-select:text;vertical-align:baseline;width:auto}a,button.faux-link{border-bottom:1px dotted currentColor;color:#fff;font-weight:600;position:relative;text-decoration:none;transition:all .2s ease}a::after,button.faux-link::after{background:currentColor;content:'';height:1px;left:50%;position:absolute;top:100%;transform:translateX(-50%);transition:width .2s ease;width:0}a:focus,a:hover,button.faux-link:focus,button.faux-link:hover{border-bottom-color:transparent;outline:0}a:focus::after,a:hover::after,button.faux-link:focus::after,button.faux-link:hover::after{width:100%}a.tab-focus,button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}a.no-border::after,button.no-border.faux-link::after{display:none}li,ul{list-style:none;margin:0;padding:0}audio,img,video{max-width:100%;vertical-align:middle}nav{display:flex;justify-content:center;margin-bottom:20px}video{max-width:100%;vertical-align:middle}.plyr{border-radius:4px;box-shadow:0 2px 5px rgba(0,0,0,.2);margin:20px auto}.plyr.plyr--audio{max-width:480px}.plyr__video-wrapper::after{border:1px solid rgba(0,0,0,.15);border-radius:inherit;bottom:0;content:'';left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.plyr__cite{display:none;margin-top:20px}.plyr__cite .icon{margin-right:4px}.plyr--audio~ul .plyr__cite--audio,.plyr--video:not(.plyr--youtube):not(.plyr--vimeo)~ul .plyr__cite--video,.plyr--vimeo~ul .plyr__cite--vimeo,.plyr--youtube~ul .plyr__cite--youtube{display:block}@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:inherit;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui button.faux-link,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:12px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:13px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--video .plyr__control svg{filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{height:20px;left:2px;position:relative;width:20px}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--hide-controls .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls .plyr__progress+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:2px}.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0;margin-right:auto}.plyr__controls:empty{display:none}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:10px}}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:13px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:13px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#1aafff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:11px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:12px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__progress{flex:1;left:7px;margin-right:14px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:11px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(183,197,205,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}.no-border{border:0}[hidden]{display:none}.sr-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;opacity:.001;overflow:hidden;padding:0;position:absolute;width:1px} \ No newline at end of file
+@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:300;src:url(https://cdn.plyr.io/static/fonts/gordita-light.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-light.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:400;src:url(https://cdn.plyr.io/static/fonts/gordita-regular.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-regular.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:500;src:url(https://cdn.plyr.io/static/fonts/gordita-medium.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-medium.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:600;src:url(https://cdn.plyr.io/static/fonts/gordita-bold.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-bold.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:900;src:url(https://cdn.plyr.io/static/fonts/gordita-black.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-black.woff) format("woff")}@keyframes fadein{0%{opacity:0}100%{opacity:1}}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a,button.faux-link{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}*,::after,::before{box-sizing:border-box}body,html{display:flex;width:100%}html{background:linear-gradient(to left top,#4dc1ff,#0074b3);background-attachment:fixed;height:100%}body{align-items:center;display:flex;flex-direction:column;min-height:100%}.grid{flex:1;overflow:auto}main{margin:auto;padding-bottom:1px;text-align:center}aside{align-items:center;background:#fff;color:#55646b;display:flex;flex-shrink:0;justify-content:center;padding:15px;position:relative;text-align:center;text-shadow:none;width:100%}aside .icon{fill:#4baaf4;margin-right:10px}aside p{margin:0}aside a,aside button.faux-link{color:#4baaf4}aside a.tab-focus,aside button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(75,170,244,.35);outline:0}.grid{margin:0 auto;padding:20px}@media only screen and (min-width:768px){.grid{align-items:center;display:flex;max-width:1260px;width:100%}.grid>*{flex:1}}html{font-size:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-size:15px;font-size:.9375rem;color:#fff;font-family:Gordita,Avenir,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-weight:500;line-height:1.75;text-shadow:0 1px 1px rgba(0,0,0,.15)}button,input,select,textarea{font:inherit}p,small{margin:0 0 20px}small{font-size:13px;font-size:.8125rem;display:block}h1{font-size:64px;font-size:4rem;font-weight:600;letter-spacing:-.025em;line-height:1.2;margin:0 0 20px}.button,.button__count{align-items:center;background:#fff;border:0;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);color:#55646b;display:inline-flex;padding:15px;position:relative;text-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.button{font-weight:600;padding-left:20px;padding-right:20px;transition:all .2s ease}.button:focus,.button:hover{color:#343f4a}.button:focus::after,.button:hover::after{display:none}.button:hover{box-shadow:0 2px 2px rgba(0,0,0,.1);transform:translateY(-1px)}.button:focus{outline:0}.button.tab-focus{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}.button:active{transform:translateY(1px)}.button--with-count{display:inline-flex}.button--with-count .button .icon{flex-shrink:0}.button__count{animation:fadein .2s ease;margin-left:10px}.button__count::before{border:5px solid transparent;border-left-width:0;border-right-color:#fff;content:'';height:0;position:absolute;right:100%;top:50%;transform:translateY(-50%);width:0}header{padding-bottom:20px;text-align:center}header .call-to-action{margin-top:30px}@media only screen and (min-width:768px){header{margin-right:60px;max-width:360px;padding-bottom:40px;text-align:left}}.icon{fill:currentColor;height:16px;vertical-align:-3px;width:16px}a svg,button svg,button.faux-link svg,label svg{pointer-events:none}.btn .icon,a .icon,button.faux-link .icon{margin-right:6px}button.faux-link{background:0 0;border:0;border-radius:0;cursor:pointer;font:inherit;line-height:1.75;margin:0;padding:0;position:relative;text-align:inherit;text-shadow:inherit;-moz-user-select:text;vertical-align:baseline;width:auto}a,button.faux-link{border-bottom:1px dotted currentColor;color:#fff;font-weight:600;position:relative;text-decoration:none;transition:all .2s ease}a::after,button.faux-link::after{background:currentColor;content:'';height:1px;left:50%;position:absolute;top:100%;transform:translateX(-50%);transition:width .2s ease;width:0}a:focus,a:hover,button.faux-link:focus,button.faux-link:hover{border-bottom-color:transparent;outline:0}a:focus::after,a:hover::after,button.faux-link:focus::after,button.faux-link:hover::after{width:100%}a.tab-focus,button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}a.no-border::after,button.no-border.faux-link::after{display:none}li,ul{list-style:none;margin:0;padding:0}audio,img,video{max-width:100%;vertical-align:middle}nav{display:flex;justify-content:center;margin-bottom:20px}video{max-width:100%;vertical-align:middle}.plyr{border-radius:4px;box-shadow:0 2px 5px rgba(0,0,0,.2);margin:20px auto}.plyr.plyr--audio{max-width:480px}.plyr__video-wrapper::after{border:1px solid rgba(0,0,0,.15);border-radius:inherit;bottom:0;content:'';left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.plyr__cite{display:none;margin-top:20px}.plyr__cite .icon{margin-right:4px}.plyr--audio~ul .plyr__cite--audio,.plyr--video:not(.plyr--youtube):not(.plyr--vimeo)~ul .plyr__cite--video,.plyr--vimeo~ul .plyr__cite--vimeo,.plyr--youtube~ul .plyr__cite--youtube{display:block}@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:inherit;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui button.faux-link,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:12px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:13px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--video .plyr__control svg{filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls .plyr__progress+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:2px}.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0;margin-right:auto}.plyr__controls:empty{display:none}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:10px}}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:13px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:13px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#1aafff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:11px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:12px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__progress{flex:1;left:7px;margin-right:14px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:11px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(183,197,205,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}.no-border{border:0}[hidden]{display:none}.sr-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;opacity:.001;overflow:hidden;padding:0;position:absolute;width:1px} \ No newline at end of file
diff --git a/demo/dist/demo.js b/demo/dist/demo.js
index 8363e33f..e3d4e6c2 100644
--- a/demo/dist/demo.js
+++ b/demo/dist/demo.js
@@ -1833,7 +1833,6 @@ typeof navigator === "object" && (function () {
};
this._fetchDefaults = {
method: 'POST',
- keepalive: true,
// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
// https://caniuse.com/#feat=referrer-policy
// It doesn't. And it throw exception instead of ignoring this parameter...
@@ -1874,7 +1873,7 @@ typeof navigator === "object" && (function () {
// webpack (using a build step causes webpack #1617). Grunt verifies that
// this value matches package.json during build.
// See: https://github.com/getsentry/raven-js/issues/465
- VERSION: '3.26.4',
+ VERSION: '3.27.0',
debug: false,
@@ -2612,7 +2611,7 @@ typeof navigator === "object" && (function () {
)
return;
- options = Object.assign(
+ options = objectMerge$1(
{
eventId: this.lastEventId(),
dsn: this._dsn,
@@ -4093,276 +4092,263 @@ typeof navigator === "object" && (function () {
// ==========================================================================
(function () {
- var host = window.location.host;
+ var host = window.location.host;
+ var env = {
+ prod: host === 'plyr.io',
+ dev: host === 'dev.plyr.io'
+ };
+ document.addEventListener('DOMContentLoaded', function () {
+ singleton.context(function () {
+ var selector = '#player';
+ var container = document.getElementById('container');
+
+ if (window.shr) {
+ window.shr.setup({
+ count: {
+ classname: 'button__count'
+ }
+ });
+ } // Setup tab focus
- var env = {
- prod: host === 'plyr.io',
- dev: host === 'dev.plyr.io'
- };
- document.addEventListener('DOMContentLoaded', function () {
- singleton.context(function () {
- var selector = '#player';
- var container = document.getElementById('container');
+ var tabClassName = 'tab-focus'; // Remove class on blur
- if (window.shr) {
- window.shr.setup({
- count: {
- classname: 'button__count'
- }
- });
- }
+ document.addEventListener('focusout', function (event) {
+ if (!event.target.classList || container.contains(event.target)) {
+ return;
+ }
- // Setup tab focus
- var tabClassName = 'tab-focus';
+ event.target.classList.remove(tabClassName);
+ }); // Add classname to tabbed elements
- // Remove class on blur
- document.addEventListener('focusout', function (event) {
- if (!event.target.classList || container.contains(event.target)) {
- return;
- }
+ document.addEventListener('keydown', function (event) {
+ if (event.keyCode !== 9) {
+ return;
+ } // Delay the adding of classname until the focus has changed
+ // This event fires before the focusin event
- event.target.classList.remove(tabClassName);
- });
- // Add classname to tabbed elements
- document.addEventListener('keydown', function (event) {
- if (event.keyCode !== 9) {
- return;
- }
+ setTimeout(function () {
+ var focused = document.activeElement;
- // Delay the adding of classname until the focus has changed
- // This event fires before the focusin event
- setTimeout(function () {
- var focused = document.activeElement;
+ if (!focused || !focused.classList || container.contains(focused)) {
+ return;
+ }
- if (!focused || !focused.classList || container.contains(focused)) {
- return;
- }
+ focused.classList.add(tabClassName);
+ }, 10);
+ }); // Setup the player
- focused.classList.add(tabClassName);
- }, 10);
- });
-
- // Setup the player
- var player = new Plyr(selector, {
- debug: true,
- title: 'View From A Blue Moon',
- iconUrl: '../dist/plyr.svg',
- keyboard: {
- global: true
- },
- tooltips: {
- controls: true
- },
- captions: {
- active: true
- },
- keys: {
- google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c'
- },
- ads: {
- enabled: env.prod || env.dev,
- publisherId: '918848828995742'
- }
- });
-
- // Expose for tinkering in the console
- window.player = player;
-
- // Setup type toggle
- var buttons = document.querySelectorAll('[data-source]');
- var types = {
- video: 'video',
- audio: 'audio',
- youtube: 'youtube',
- vimeo: 'vimeo'
- };
- var currentType = window.location.hash.replace('#', '');
- var historySupport = window.history && window.history.pushState;
+ var player = new Plyr(selector, {
+ debug: true,
+ title: 'View From A Blue Moon',
+ iconUrl: '../dist/plyr.svg',
+ keyboard: {
+ global: true
+ },
+ tooltips: {
+ controls: true
+ },
+ captions: {
+ active: true
+ },
+ keys: {
+ google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c'
+ },
+ ads: {
+ enabled: env.prod || env.dev,
+ publisherId: '918848828995742'
+ }
+ }); // Expose for tinkering in the console
- // Toggle class on an element
- function toggleClass(element, className, state) {
- if (element) {
- element.classList[state ? 'add' : 'remove'](className);
- }
- }
+ window.player = player; // Setup type toggle
- // Set a new source
- function newSource(type, init) {
- // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video
- if (!(type in types) || !init && type === currentType || !currentType.length && type === types.video) {
- return;
- }
+ var buttons = document.querySelectorAll('[data-source]');
+ var types = {
+ video: 'video',
+ audio: 'audio',
+ youtube: 'youtube',
+ vimeo: 'vimeo'
+ };
+ var currentType = window.location.hash.replace('#', '');
+ var historySupport = window.history && window.history.pushState; // Toggle class on an element
- switch (type) {
- case types.video:
- player.source = {
- type: 'video',
- title: 'View From A Blue Moon',
- sources: [{
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',
- type: 'video/mp4',
- size: 576
- }, {
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',
- type: 'video/mp4',
- size: 720
- }, {
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',
- type: 'video/mp4',
- size: 1080
- }, {
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',
- type: 'video/mp4',
- size: 1440
- }],
- poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',
- tracks: [{
- kind: 'captions',
- label: 'English',
- srclang: 'en',
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
- default: true
- }, {
- kind: 'captions',
- label: 'French',
- srclang: 'fr',
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt'
- }]
- };
-
- break;
-
- case types.audio:
- player.source = {
- type: 'audio',
- title: 'Kishi Bashi – “It All Began With A Burst”',
- sources: [{
- src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',
- type: 'audio/mp3'
- }, {
- src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',
- type: 'audio/ogg'
- }]
- };
-
- break;
-
- case types.youtube:
- player.source = {
- type: 'video',
- sources: [{
- src: 'https://youtube.com/watch?v=bTqVqk7FSmY',
- provider: 'youtube'
- }]
- };
-
- break;
-
- case types.vimeo:
- player.source = {
- type: 'video',
- sources: [{
- src: 'https://vimeo.com/76979871',
- provider: 'vimeo'
- }]
- };
-
- break;
-
- default:
- break;
- }
+ function toggleClass(element, className, state) {
+ if (element) {
+ element.classList[state ? 'add' : 'remove'](className);
+ }
+ } // Set a new source
- // Set the current type for next time
- currentType = type;
- // Remove active classes
- Array.from(buttons).forEach(function (button) {
- return toggleClass(button.parentElement, 'active', false);
- });
+ function newSource(type, init) {
+ // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video
+ if (!(type in types) || !init && type === currentType || !currentType.length && type === types.video) {
+ return;
+ }
- // Set active on parent
- toggleClass(document.querySelector('[data-source="' + type + '"]'), 'active', true);
+ switch (type) {
+ case types.video:
+ player.source = {
+ type: 'video',
+ title: 'View From A Blue Moon',
+ sources: [{
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',
+ type: 'video/mp4',
+ size: 576
+ }, {
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',
+ type: 'video/mp4',
+ size: 720
+ }, {
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',
+ type: 'video/mp4',
+ size: 1080
+ }, {
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',
+ type: 'video/mp4',
+ size: 1440
+ }],
+ poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',
+ tracks: [{
+ kind: 'captions',
+ label: 'English',
+ srclang: 'en',
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
+ default: true
+ }, {
+ kind: 'captions',
+ label: 'French',
+ srclang: 'fr',
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt'
+ }]
+ };
+ break;
+
+ case types.audio:
+ player.source = {
+ type: 'audio',
+ title: 'Kishi Bashi – “It All Began With A Burst”',
+ sources: [{
+ src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',
+ type: 'audio/mp3'
+ }, {
+ src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',
+ type: 'audio/ogg'
+ }]
+ };
+ break;
+
+ case types.youtube:
+ player.source = {
+ type: 'video',
+ sources: [{
+ src: 'https://youtube.com/watch?v=bTqVqk7FSmY',
+ provider: 'youtube'
+ }]
+ };
+ break;
+
+ case types.vimeo:
+ player.source = {
+ type: 'video',
+ sources: [{
+ src: 'https://vimeo.com/76979871',
+ provider: 'vimeo'
+ }]
+ };
+ break;
- // Show cite
- Array.from(document.querySelectorAll('.plyr__cite')).forEach(function (cite) {
- cite.setAttribute('hidden', '');
- });
- document.querySelector('.plyr__cite--' + type).removeAttribute('hidden');
- }
+ default:
+ break;
+ } // Set the current type for next time
- // Bind to each button
- Array.from(buttons).forEach(function (button) {
- button.addEventListener('click', function () {
- var type = button.getAttribute('data-source');
- newSource(type);
+ currentType = type; // Remove active classes
- if (historySupport) {
- window.history.pushState({ type: type }, '', '#' + type);
- }
- });
- });
+ Array.from(buttons).forEach(function (button) {
+ return toggleClass(button.parentElement, 'active', false);
+ }); // Set active on parent
- // List for backwards/forwards
- window.addEventListener('popstate', function (event) {
- if (event.state && 'type' in event.state) {
- newSource(event.state.type);
- }
- });
+ toggleClass(document.querySelector("[data-source=\"".concat(type, "\"]")), 'active', true); // Show cite
- // On load
- if (historySupport) {
- var video = !currentType.length;
+ Array.from(document.querySelectorAll('.plyr__cite')).forEach(function (cite) {
+ cite.setAttribute('hidden', '');
+ });
+ document.querySelector(".plyr__cite--".concat(type)).removeAttribute('hidden');
+ } // Bind to each button
- // If there's no current type set, assume video
- if (video) {
- currentType = types.video;
- }
- // Replace current history state
- if (currentType in types) {
- window.history.replaceState({
- type: currentType
- }, '', video ? '' : '#' + currentType);
- }
+ Array.from(buttons).forEach(function (button) {
+ button.addEventListener('click', function () {
+ var type = button.getAttribute('data-source');
+ newSource(type);
- // If it's not video, load the source
- if (currentType !== types.video) {
- newSource(currentType, true);
- }
- }
+ if (historySupport) {
+ window.history.pushState({
+ type: type
+ }, '', "#".concat(type));
+ }
});
+ }); // List for backwards/forwards
+
+ window.addEventListener('popstate', function (event) {
+ if (event.state && 'type' in event.state) {
+ newSource(event.state.type);
+ }
+ }); // On load
+
+ if (historySupport) {
+ var video = !currentType.length; // If there's no current type set, assume video
+
+ if (video) {
+ currentType = types.video;
+ } // Replace current history state
+
+
+ if (currentType in types) {
+ window.history.replaceState({
+ type: currentType
+ }, '', video ? '' : "#".concat(currentType));
+ } // If it's not video, load the source
+
+
+ if (currentType !== types.video) {
+ newSource(currentType, true);
+ }
+ }
});
+ }); // Raven / Sentry
+ // For demo site (https://plyr.io) only
- // Raven / Sentry
- // For demo site (https://plyr.io) only
- if (env.prod) {
- singleton.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();
- }
+ if (env.prod) {
+ singleton.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();
+ } // Google analytics
+ // For demo site (https://plyr.io) only
+
+ /* eslint-disable */
+
+
+ if (env.prod) {
+ (function (i, s, o, g, r, a, m) {
+ i.GoogleAnalyticsObject = r;
+
+ i[r] = i[r] || function () {
+ (i[r].q = i[r].q || []).push(arguments);
+ };
+
+ i[r].l = 1 * new Date();
+ a = s.createElement(o);
+ m = s.getElementsByTagName(o)[0];
+ a.async = 1;
+ a.src = g;
+ m.parentNode.insertBefore(a, m);
+ })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
+
+ window.ga('create', 'UA-40881672-11', 'auto');
+ window.ga('send', 'pageview');
+ }
+ /* eslint-enable */
- // Google analytics
- // For demo site (https://plyr.io) only
- /* eslint-disable */
- if (env.prod) {
- (function (i, s, o, g, r, a, m) {
- i.GoogleAnalyticsObject = r;
- i[r] = i[r] || function () {
- (i[r].q = i[r].q || []).push(arguments);
- };
- i[r].l = 1 * new Date();
- a = s.createElement(o);
- m = s.getElementsByTagName(o)[0];
- a.async = 1;
- a.src = g;
- m.parentNode.insertBefore(a, m);
- })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
- window.ga('create', 'UA-40881672-11', 'auto');
- window.ga('send', 'pageview');
- }
- /* eslint-enable */
})();
}());
diff --git a/demo/dist/demo.js.map b/demo/dist/demo.js.map
index a0406a62..b3de0dea 100644
--- a/demo/dist/demo.js.map
+++ b/demo/dist/demo.js.map
@@ -1 +1 @@
-{"version":3,"sources":["node_modules/raven-js/vendor/json-stringify-safe/stringify.js","node_modules/raven-js/src/utils.js","node_modules/raven-js/vendor/TraceKit/tracekit.js","node_modules/raven-js/vendor/md5/md5.js","node_modules/raven-js/src/configError.js","node_modules/raven-js/src/console.js","node_modules/raven-js/src/raven.js","node_modules/raven-js/src/singleton.js","demo/src/js/demo.js"],"names":["global","stringify","_window","isErrorEvent","isDOMError","isDOMException","isError","isObject","isPlainObject","isUndefined","isFunction","isString","isArray","isEmptyObject","each","objectMerge","truncate","objectFrozen","hasKey","joinRegExp","urlencode","uuid4","htmlTreeAsString","isSameException","isSameStacktrace","parseUrl","fill","supportsFetch","supportsReferrerPolicy","serializeKeysForMessage","serializeException","sanitize","require$$0","TraceKit","md5","RavenConfigError","Raven","RavenConstructor","host","window","location","env","prod","dev","document","addEventListener","context","selector","container","getElementById","shr","setup","count","classname","tabClassName","event","target","classList","contains","remove","keyCode","setTimeout","focused","activeElement","add","player","Plyr","debug","title","iconUrl","keyboard","tooltips","controls","captions","active","keys","google","ads","enabled","publisherId","buttons","querySelectorAll","types","video","audio","youtube","vimeo","currentType","hash","replace","historySupport","history","pushState","toggleClass","element","className","state","newSource","type","init","length","source","sources","src","size","poster","tracks","kind","label","srclang","default","provider","Array","from","forEach","button","parentElement","querySelector","cite","setAttribute","removeAttribute","getAttribute","replaceState","config","install","i","s","o","g","r","a","m","GoogleAnalyticsObject","q","push","arguments","l","Date","createElement","getElementsByTagName","async","parentNode","insertBefore","ga"],"mappings":"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","file":"demo.js","sourcesContent":["/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : typeof self !== 'undefined'\n ? self\n : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch (Object.prototype.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return Object.prototype.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isDOMError(value) {\n return Object.prototype.toString.call(value) === '[object DOMError]';\n}\n\nfunction isDOMException(value) {\n return Object.prototype.toString.call(value) === '[object DOMException]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMError() {\n try {\n new DOMError(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMException() {\n try {\n new DOMException(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n if (typeof max !== 'number') {\n throw new Error('2nd argument to `truncate` function should be a number');\n }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not <a/> href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if stacktrace is malformed\n if (frames1 === undefined || frames2 === undefined) return false;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n if (typeof value === 'string') {\n var maxLength = 40;\n return truncate(value, maxLength);\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isDOMError: isDOMError,\n isDOMException: isDOMException,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsDOMError: supportsDOMError,\n supportsDOMException: supportsDOMException,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n return document.location.href;\n}\n\nfunction getLocationOrigin() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n // Oh dear IE10...\n if (!document.location.origin) {\n return (\n document.location.protocol +\n '//' +\n document.location.hostname +\n (document.location.port ? ':' + document.location.port : '')\n );\n }\n\n return document.location.origin;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.<string, *>} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n if (element.url && element.url.substr(0, 5) === 'blob:') {\n // Special case for handling JavaScript loaded into a blob.\n // We use a synchronous AJAX request here as a blob is already in\n // memory - it's not making a network request. This will generate a warning\n // in the browser console, but there has already been an error so that's not\n // that much of an issue.\n var xhr = new XMLHttpRequest();\n xhr.open('GET', element.url, false);\n xhr.send(null);\n\n // If we failed to download the source, skip this patch\n if (xhr.status === 200) {\n var source = xhr.responseText || '';\n\n // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.\n // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175\n source = source.slice(-300);\n\n // Now we dig out the source map URL\n var sourceMaps = source.match(/\\/\\/# sourceMappingURL=(.*)$/);\n\n // If we don't find a source map comment or we find more than one, continue on to the next element.\n if (sourceMaps) {\n var sourceMapAddress = sourceMaps[1];\n\n // Now we check to see if it's a relative URL.\n // If it is, convert it to an absolute one.\n if (sourceMapAddress.charAt(0) === '~') {\n sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);\n }\n\n // Now we strip the '.map' off of the end of the URL and update the\n // element so that Sentry can match the map to the blob.\n element.url = sourceMapAddress.slice(0, -4);\n }\n }\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.<string, *>} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isErrorEvent = utils.isErrorEvent;\nvar isDOMError = utils.isDOMError;\nvar isDOMException = utils.isDOMException;\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n keepalive: true,\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.26.4',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = {};\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} _before A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason, {\n mechanism: {\n type: 'onunhandledrejection',\n handled: false\n }\n });\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isDOMError(ex) || isDOMException(ex)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var name = ex.name || (isDOMError(ex) ? 'DOMError' : 'DOMException');\n var message = ex.message ? name + ': ' + ex.message : name;\n\n return this.captureMessage(\n message,\n objectMerge(options, {\n // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well\n // but it's barely any overhead so we may at least try\n stacktrace: true,\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a DOMError/DOMException\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n\n // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n // initialCall => captureException(string) => captureMessage(string)\n if (initialCall && initialCall.func === 'Raven.captureException') {\n initialCall = stack.stack[2];\n }\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n // Always attempt to get stacktrace if message is empty.\n // It's the only way to provide any helpful information to the user.\n if (this._globalOptions.stacktrace || options.stacktrace || data.message === '') {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = Object.assign(\n {\n eventId: this.lastEventId(),\n dsn: this._dsn,\n user: this._globalContext.user || {}\n },\n options\n );\n\n if (!options.eventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n if (!options.dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var encodedOptions = [];\n\n for (var key in options) {\n if (key === 'user') {\n var user = options.user;\n if (user.name) encodedOptions.push('name=' + encode(user.name));\n if (user.email) encodedOptions.push('email=' + encode(user.email));\n } else {\n encodedOptions.push(encode(key) + '=' + encode(options[key]));\n }\n }\n var globalServer = this._getGlobalServer(this._parseDSN(options.dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/?' + encodedOptions.join('&');\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '<unknown>';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: orig.name || '<anonymous>'}\n }\n },\n originalCallback\n );\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'handleEvent',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn.handleEvent\n );\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'addEventListener',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn,\n before\n ),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'requestAnimationFrame',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n cb\n )\n );\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}\n }\n },\n orig\n );\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'onreadystatechange',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n orig,\n onreadystatechangeHandler\n );\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch\n .apply(this, args)\n .then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n })\n ['catch'](function(err) {\n // if there is an error performing the request\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData,\n level: 'error'\n });\n\n throw err;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else if (_document.attachEvent) {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n _window.history.pushState &&\n _window.history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(_window.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(_window.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function(stackInfo, options) {\n options = options || {};\n options.mechanism = options.mechanism || {\n type: 'onerror',\n handled: false\n };\n\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo(stackInfo, options);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n transaction: fileurl\n },\n options\n );\n\n var ex = data.exception.values[0];\n if (ex.type == null && ex.value === '') {\n ex.value = 'Unrecoverable error caught';\n }\n\n // Move mechanism from options to exception interface\n // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be\n // too much\n if (!data.exception.mechanism && data.mechanism) {\n data.exception.mechanism = data.mechanism;\n delete data.mechanism;\n }\n\n data.exception.mechanism = objectMerge(\n {\n type: 'generic',\n handled: true\n },\n data.exception.mechanism || {}\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': _navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.transaction !== last.transaction // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n if (\n this._originalConsoleMethods[level] &&\n (this.debug || this._globalOptions.debug)\n ) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const { host } = window.location;\n const env = {\n prod: host === 'plyr.io',\n dev: host === 'dev.plyr.io',\n };\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n const selector = '#player';\n const container = document.getElementById('container');\n\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n if (!event.target.classList || container.contains(event.target)) {\n return;\n }\n\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n const focused = document.activeElement;\n\n if (!focused || !focused.classList || container.contains(focused)) {\n return;\n }\n\n focused.classList.add(tabClassName);\n }, 10);\n });\n\n // Setup the player\n const player = new Plyr(selector, {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: env.prod || env.dev,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (\n !(type in types) ||\n (!init && type === currentType) ||\n (!currentType.length && type === types.video)\n ) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [\n {\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n },\n ],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [\n {\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n },\n ],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (env.prod) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (env.prod) {\n ((i, s, o, g, r, a, m) => {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]} \ No newline at end of file
+{"version":3,"sources":["node_modules/raven-js/vendor/json-stringify-safe/stringify.js","node_modules/raven-js/src/utils.js","node_modules/raven-js/vendor/TraceKit/tracekit.js","node_modules/raven-js/vendor/md5/md5.js","node_modules/raven-js/src/configError.js","node_modules/raven-js/src/console.js","node_modules/raven-js/src/raven.js","node_modules/raven-js/src/singleton.js","demo/src/js/demo.js"],"names":["global","stringify","_window","isErrorEvent","isDOMError","isDOMException","isError","isObject","isPlainObject","isUndefined","isFunction","isString","isArray","isEmptyObject","each","objectMerge","truncate","objectFrozen","hasKey","joinRegExp","urlencode","uuid4","htmlTreeAsString","isSameException","isSameStacktrace","parseUrl","fill","supportsFetch","supportsReferrerPolicy","serializeKeysForMessage","serializeException","sanitize","require$$0","TraceKit","md5","RavenConfigError","Raven","RavenConstructor","host","window","location","env","prod","dev","document","addEventListener","context","selector","container","getElementById","shr","setup","count","classname","tabClassName","event","target","classList","contains","remove","keyCode","setTimeout","focused","activeElement","add","player","Plyr","debug","title","iconUrl","keyboard","tooltips","controls","captions","active","keys","google","ads","enabled","publisherId","buttons","querySelectorAll","types","video","audio","youtube","vimeo","currentType","hash","replace","historySupport","history","pushState","toggleClass","element","className","state","newSource","type","init","length","source","sources","src","size","poster","tracks","kind","label","srclang","default","provider","Array","from","forEach","button","parentElement","querySelector","cite","setAttribute","removeAttribute","getAttribute","replaceState","config","install","i","s","o","g","r","a","m","GoogleAnalyticsObject","q","push","arguments","l","Date","createElement","getElementsByTagName","async","parentNode","insertBefore","ga"],"mappings":"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","file":"demo.js","sourcesContent":["/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : typeof self !== 'undefined'\n ? self\n : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch (Object.prototype.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return Object.prototype.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isDOMError(value) {\n return Object.prototype.toString.call(value) === '[object DOMError]';\n}\n\nfunction isDOMException(value) {\n return Object.prototype.toString.call(value) === '[object DOMException]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMError() {\n try {\n new DOMError(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMException() {\n try {\n new DOMException(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n if (typeof max !== 'number') {\n throw new Error('2nd argument to `truncate` function should be a number');\n }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not <a/> href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if stacktrace is malformed\n if (frames1 === undefined || frames2 === undefined) return false;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n if (typeof value === 'string') {\n var maxLength = 40;\n return truncate(value, maxLength);\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isDOMError: isDOMError,\n isDOMException: isDOMException,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsDOMError: supportsDOMError,\n supportsDOMException: supportsDOMException,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n return document.location.href;\n}\n\nfunction getLocationOrigin() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n // Oh dear IE10...\n if (!document.location.origin) {\n return (\n document.location.protocol +\n '//' +\n document.location.hostname +\n (document.location.port ? ':' + document.location.port : '')\n );\n }\n\n return document.location.origin;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.<string, *>} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n if (element.url && element.url.substr(0, 5) === 'blob:') {\n // Special case for handling JavaScript loaded into a blob.\n // We use a synchronous AJAX request here as a blob is already in\n // memory - it's not making a network request. This will generate a warning\n // in the browser console, but there has already been an error so that's not\n // that much of an issue.\n var xhr = new XMLHttpRequest();\n xhr.open('GET', element.url, false);\n xhr.send(null);\n\n // If we failed to download the source, skip this patch\n if (xhr.status === 200) {\n var source = xhr.responseText || '';\n\n // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.\n // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175\n source = source.slice(-300);\n\n // Now we dig out the source map URL\n var sourceMaps = source.match(/\\/\\/# sourceMappingURL=(.*)$/);\n\n // If we don't find a source map comment or we find more than one, continue on to the next element.\n if (sourceMaps) {\n var sourceMapAddress = sourceMaps[1];\n\n // Now we check to see if it's a relative URL.\n // If it is, convert it to an absolute one.\n if (sourceMapAddress.charAt(0) === '~') {\n sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);\n }\n\n // Now we strip the '.map' off of the end of the URL and update the\n // element so that Sentry can match the map to the blob.\n element.url = sourceMapAddress.slice(0, -4);\n }\n }\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.<string, *>} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isErrorEvent = utils.isErrorEvent;\nvar isDOMError = utils.isDOMError;\nvar isDOMException = utils.isDOMException;\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.27.0',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = {};\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} _before A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason, {\n mechanism: {\n type: 'onunhandledrejection',\n handled: false\n }\n });\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isDOMError(ex) || isDOMException(ex)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var name = ex.name || (isDOMError(ex) ? 'DOMError' : 'DOMException');\n var message = ex.message ? name + ': ' + ex.message : name;\n\n return this.captureMessage(\n message,\n objectMerge(options, {\n // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well\n // but it's barely any overhead so we may at least try\n stacktrace: true,\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a DOMError/DOMException\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n\n // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n // initialCall => captureException(string) => captureMessage(string)\n if (initialCall && initialCall.func === 'Raven.captureException') {\n initialCall = stack.stack[2];\n }\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n // Always attempt to get stacktrace if message is empty.\n // It's the only way to provide any helpful information to the user.\n if (this._globalOptions.stacktrace || options.stacktrace || data.message === '') {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = objectMerge(\n {\n eventId: this.lastEventId(),\n dsn: this._dsn,\n user: this._globalContext.user || {}\n },\n options\n );\n\n if (!options.eventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n if (!options.dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var encodedOptions = [];\n\n for (var key in options) {\n if (key === 'user') {\n var user = options.user;\n if (user.name) encodedOptions.push('name=' + encode(user.name));\n if (user.email) encodedOptions.push('email=' + encode(user.email));\n } else {\n encodedOptions.push(encode(key) + '=' + encode(options[key]));\n }\n }\n var globalServer = this._getGlobalServer(this._parseDSN(options.dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/?' + encodedOptions.join('&');\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '<unknown>';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: orig.name || '<anonymous>'}\n }\n },\n originalCallback\n );\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'handleEvent',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn.handleEvent\n );\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'addEventListener',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn,\n before\n ),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'requestAnimationFrame',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n cb\n )\n );\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}\n }\n },\n orig\n );\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'onreadystatechange',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n orig,\n onreadystatechangeHandler\n );\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch\n .apply(this, args)\n .then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n })\n ['catch'](function(err) {\n // if there is an error performing the request\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData,\n level: 'error'\n });\n\n throw err;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else if (_document.attachEvent) {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n _window.history.pushState &&\n _window.history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(_window.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(_window.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function(stackInfo, options) {\n options = options || {};\n options.mechanism = options.mechanism || {\n type: 'onerror',\n handled: false\n };\n\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo(stackInfo, options);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n transaction: fileurl\n },\n options\n );\n\n var ex = data.exception.values[0];\n if (ex.type == null && ex.value === '') {\n ex.value = 'Unrecoverable error caught';\n }\n\n // Move mechanism from options to exception interface\n // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be\n // too much\n if (!data.exception.mechanism && data.mechanism) {\n data.exception.mechanism = data.mechanism;\n delete data.mechanism;\n }\n\n data.exception.mechanism = objectMerge(\n {\n type: 'generic',\n handled: true\n },\n data.exception.mechanism || {}\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': _navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.transaction !== last.transaction // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n if (\n this._originalConsoleMethods[level] &&\n (this.debug || this._globalOptions.debug)\n ) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const { host } = window.location;\n const env = {\n prod: host === 'plyr.io',\n dev: host === 'dev.plyr.io',\n };\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n const selector = '#player';\n const container = document.getElementById('container');\n\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n if (!event.target.classList || container.contains(event.target)) {\n return;\n }\n\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n const focused = document.activeElement;\n\n if (!focused || !focused.classList || container.contains(focused)) {\n return;\n }\n\n focused.classList.add(tabClassName);\n }, 10);\n });\n\n // Setup the player\n const player = new Plyr(selector, {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: env.prod || env.dev,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (\n !(type in types) ||\n (!init && type === currentType) ||\n (!currentType.length && type === types.video)\n ) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [\n {\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n },\n ],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [\n {\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n },\n ],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (env.prod) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (env.prod) {\n ((i, s, o, g, r, a, m) => {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]} \ No newline at end of file
diff --git a/demo/dist/demo.min.js b/demo/dist/demo.min.js
index 2ec99c62..0050e0f2 100644
--- a/demo/dist/demo.min.js
+++ b/demo/dist/demo.min.js
@@ -1,2 +1,2 @@
-"object"==typeof navigator&&function(){"use strict";var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var t,r=(function(e,t){function r(e,t){for(var r=0;r<e.length;++r)if(e[r]===t)return r;return-1}function n(e,t){var n=[],o=[];return null==t&&(t=function(e,t){return n[0]===t?"[Circular ~]":"[Circular ~."+o.slice(0,r(n,t)).join(".")+"]"}),function(i,a){if(n.length>0){var s=r(n,this);~s?n.splice(s+1):n.push(this),~s?o.splice(s,1/0,i):o.push(i),~r(n,a)&&(a=t.call(this,i,a))}else n.push(a);return null==e?a instanceof Error?function(e){var t={stack:e.stack,message:e.message,name:e.name};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(a):a:e.call(this,i,a)}}(e.exports=function(e,t,r,o){return JSON.stringify(e,n(t,o),r)}).getSerialize=n}(t={exports:{}},t.exports),t.exports),n=(r.getSerialize,"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{});function o(e){return void 0===e}function i(e){return"[object Object]"===Object.prototype.toString.call(e)}function a(e){return"[object String]"===Object.prototype.toString.call(e)}function s(e){return"[object Array]"===Object.prototype.toString.call(e)}function c(){if(!("fetch"in n))return!1;try{return new Headers,new Request(""),new Response,!0}catch(e){return!1}}function l(e,t){var r,n;if(o(e.length))for(r in e)h(e,r)&&t.call(null,r,e[r]);else if(n=e.length)for(r=0;r<n;r++)t.call(null,r,e[r])}function u(e,t){if("number"!=typeof t)throw new Error("2nd argument to `truncate` function should be a number");return"string"!=typeof e||0===t?e:e.length<=t?e:e.substr(0,t)+"…"}function h(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function p(e){for(var t,r=[],n=0,o=e.length;n<o;n++)a(t=e[n])?r.push(t.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")):t&&t.source&&r.push(t.source);return new RegExp(r.join("|"),"i")}function f(e){var t,r,n,o,i,s=[];if(!e||!e.tagName)return"";if(s.push(e.tagName.toLowerCase()),e.id&&s.push("#"+e.id),(t=e.className)&&a(t))for(r=t.split(/\s+/),i=0;i<r.length;i++)s.push("."+r[i]);var c=["type","name","title","alt"];for(i=0;i<c.length;i++)n=c[i],(o=e.getAttribute(n))&&s.push("["+n+'="'+o+'"]');return s.join("")}function d(e,t){return!!(!!e^!!t)}function g(e,t){if(d(e,t))return!1;var r,n,o=e.frames,i=t.frames;if(void 0===o||void 0===i)return!1;if(o.length!==i.length)return!1;for(var a=0;a<o.length;a++)if(r=o[a],n=i[a],r.filename!==n.filename||r.lineno!==n.lineno||r.colno!==n.colno||r.function!==n.function)return!1;return!0}var m=3,_=51200,v=40;function b(e){return function(e){return~-encodeURI(e).split(/%..|./).length}(JSON.stringify(e))}function y(e){if("string"==typeof e){return u(e,40)}if("number"==typeof e||"boolean"==typeof e||void 0===e)return e;var t=Object.prototype.toString.call(e);return"[object Object]"===t?"[Object]":"[object Array]"===t?"[Array]":"[object Function]"===t?e.name?"[Function: "+e.name+"]":"[Function]":e}var E={isObject:function(e){return"object"==typeof e&&null!==e},isError:function(e){switch(Object.prototype.toString.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return e instanceof Error}},isErrorEvent:function(e){return"[object ErrorEvent]"===Object.prototype.toString.call(e)},isDOMError:function(e){return"[object DOMError]"===Object.prototype.toString.call(e)},isDOMException:function(e){return"[object DOMException]"===Object.prototype.toString.call(e)},isUndefined:o,isFunction:function(e){return"function"==typeof e},isPlainObject:i,isString:a,isArray:s,isEmptyObject:function(e){if(!i(e))return!1;for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},supportsErrorEvent:function(){try{return new ErrorEvent(""),!0}catch(e){return!1}},supportsDOMError:function(){try{return new DOMError(""),!0}catch(e){return!1}},supportsDOMException:function(){try{return new DOMException(""),!0}catch(e){return!1}},supportsFetch:c,supportsReferrerPolicy:function(){if(!c())return!1;try{return new Request("pickleRick",{referrerPolicy:"origin"}),!0}catch(e){return!1}},supportsPromiseRejectionEvent:function(){return"function"==typeof PromiseRejectionEvent},wrappedCallback:function(e){return function(t,r){var n=e(t)||t;return r&&r(n)||n}},each:l,objectMerge:function(e,t){return t?(l(t,function(t,r){e[t]=r}),e):e},truncate:u,objectFrozen:function(e){return!!Object.isFrozen&&Object.isFrozen(e)},hasKey:h,joinRegExp:p,urlencode:function(e){var t=[];return l(e,function(e,r){t.push(encodeURIComponent(e)+"="+encodeURIComponent(r))}),t.join("&")},uuid4:function(){var e=n.crypto||n.msCrypto;if(!o(e)&&e.getRandomValues){var t=new Uint16Array(8);e.getRandomValues(t),t[3]=4095&t[3]|16384,t[4]=16383&t[4]|32768;var r=function(e){for(var t=e.toString(16);t.length<4;)t="0"+t;return t};return r(t[0])+r(t[1])+r(t[2])+r(t[3])+r(t[4])+r(t[5])+r(t[6])+r(t[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})},htmlTreeAsString:function(e){for(var t,r=[],n=0,o=0,i=" > ".length;e&&n++<5&&!("html"===(t=f(e))||n>1&&o+r.length*i+t.length>=80);)r.push(t),o+=t.length,e=e.parentNode;return r.reverse().join(" > ")},htmlElementAsString:f,isSameException:function(e,t){return!d(e,t)&&(e=e.values[0],t=t.values[0],e.type===t.type&&e.value===t.value&&(r=e.stacktrace,n=t.stacktrace,(!o(r)||!o(n))&&g(e.stacktrace,t.stacktrace)));var r,n},isSameStacktrace:g,parseUrl:function(e){if("string"!=typeof e)return{};var t=e.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/),r=t[6]||"",n=t[8]||"";return{protocol:t[2],host:t[4],path:t[5],relative:t[5]+r+n}},fill:function(e,t,r,n){if(null!=e){var o=e[t];e[t]=r(o),e[t].__raven__=!0,e[t].__orig__=o,n&&n.push([e,t,o])}},safeJoin:function(e,t){if(!s(e))return"";for(var r=[],n=0;n<e.length;n++)try{r.push(String(e[n]))}catch(e){r.push("[value cannot be serialized]")}return r.join(t)},serializeException:function e(t,n,o){if(!i(t))return t;o="number"!=typeof(n="number"!=typeof n?m:n)?_:o;var a=function e(t,r){return 0===r?y(t):i(t)?Object.keys(t).reduce(function(n,o){return n[o]=e(t[o],r-1),n},{}):Array.isArray(t)?t.map(function(t){return e(t,r-1)}):y(t)}(t,n);return b(r(a))>o?e(t,n-1):a},serializeKeysForMessage:function(e,t){if("number"==typeof e||"string"==typeof e)return e.toString();if(!Array.isArray(e))return"";if(0===(e=e.filter(function(e){return"string"==typeof e})).length)return"[object has no keys]";if(t="number"!=typeof t?v:t,e[0].length>=t)return e[0];for(var r=e.length;r>0;r--){var n=e.slice(0,r).join(", ");if(!(n.length>t))return r===e.length?n:n+"…"}return""},sanitize:function(e,t){if(!s(t)||s(t)&&0===t.length)return e;var n,o=p(t),a="********";try{n=JSON.parse(r(e))}catch(t){return e}return function e(t){return s(t)?t.map(function(t){return e(t)}):i(t)?Object.keys(t).reduce(function(r,n){return o.test(n)?r[n]=a:r[n]=e(t[n]),r},{}):t}(n)}},w={collectWindowErrors:!0,debug:!1},x="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},k=[].slice,S="?",O=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;function C(){return"undefined"==typeof document||null==document.location?"":document.location.href}w.report=function(){var e,t,r=[],n=null,o=null,i=null;function a(e,t){var n=null;if(!t||w.collectWindowErrors){for(var o in r)if(r.hasOwnProperty(o))try{r[o].apply(null,[e].concat(k.call(arguments,2)))}catch(e){n=e}if(n)throw n}}function s(t,r,n,o,s){var l=E.isErrorEvent(s)?s.error:s,u=E.isErrorEvent(t)?t.message:t;if(i)w.computeStackTrace.augmentStackTraceWithInitialElement(i,r,n,u),c();else if(l&&E.isError(l))a(w.computeStackTrace(l),!0);else{var h,p={url:r,line:n,column:o},f=void 0;if("[object String]"==={}.toString.call(u))(h=u.match(O))&&(f=h[1],u=h[2]);p.func=S,a({name:f,message:u,url:C(),stack:[p]},!0)}return!!e&&e.apply(this,arguments)}function c(){var e=i,t=n;n=null,i=null,o=null,a.apply(null,[e,!1].concat(t))}function l(e,t){var r=k.call(arguments,1);if(i){if(o===e)return;c()}var a=w.computeStackTrace(e);if(i=a,o=e,n=r,setTimeout(function(){o===e&&c()},a.incomplete?2e3:0),!1!==t)throw e}return l.subscribe=function(n){t||(e=x.onerror,x.onerror=s,t=!0),r.push(n)},l.unsubscribe=function(e){for(var t=r.length-1;t>=0;--t)r[t]===e&&r.splice(t,1)},l.uninstall=function(){t&&(x.onerror=e,t=!1,e=void 0),r=[]},l}(),w.computeStackTrace=function(){function e(e){if(void 0!==e.stack&&e.stack){for(var t,r,n,o=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,i=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,a=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i,s=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,c=/\((\S*)(?::(\d+))(?::(\d+))\)/,l=e.stack.split("\n"),u=[],h=(/^(.*) is undefined$/.exec(e.message),0),p=l.length;h<p;++h){if(r=o.exec(l[h])){var f=r[2]&&0===r[2].indexOf("native");r[2]&&0===r[2].indexOf("eval")&&(t=c.exec(r[2]))&&(r[2]=t[1],r[3]=t[2],r[4]=t[3]),n={url:f?null:r[2],func:r[1]||S,args:f?[r[2]]:[],line:r[3]?+r[3]:null,column:r[4]?+r[4]:null}}else if(r=i.exec(l[h]))n={url:r[2],func:r[1]||S,args:[],line:+r[3],column:r[4]?+r[4]:null};else{if(!(r=a.exec(l[h])))continue;r[3]&&r[3].indexOf(" > eval")>-1&&(t=s.exec(r[3]))?(r[3]=t[1],r[4]=t[2],r[5]=null):0!==h||r[5]||void 0===e.columnNumber||(u[0].column=e.columnNumber+1),n={url:r[3],func:r[1]||S,args:r[2]?r[2].split(","):[],line:r[4]?+r[4]:null,column:r[5]?+r[5]:null}}if(!n.func&&n.line&&(n.func=S),n.url&&"blob:"===n.url.substr(0,5)){var d=new XMLHttpRequest;if(d.open("GET",n.url,!1),d.send(null),200===d.status){var g=d.responseText||"",m=(g=g.slice(-300)).match(/\/\/# sourceMappingURL=(.*)$/);if(m){var _=m[1];"~"===_.charAt(0)&&(_=("undefined"==typeof document||null==document.location?"":document.location.origin?document.location.origin:document.location.protocol+"//"+document.location.hostname+(document.location.port?":"+document.location.port:""))+_.slice(1)),n.url=_.slice(0,-4)}}}u.push(n)}return u.length?{name:e.name,message:e.message,url:C(),stack:u}:null}}function t(e,t,r,n){var o={url:t,line:r};if(o.url&&o.line){if(e.incomplete=!1,o.func||(o.func=S),e.stack.length>0&&e.stack[0].url===o.url){if(e.stack[0].line===o.line)return!1;if(!e.stack[0].line&&e.stack[0].func===o.func)return e.stack[0].line=o.line,!1}return e.stack.unshift(o),e.partial=!0,!0}return e.incomplete=!0,!1}function r(e,o){for(var i,a,s=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,c=[],l={},u=!1,h=r.caller;h&&!u;h=h.caller)if(h!==n&&h!==w.report){if(a={url:null,func:S,line:null,column:null},h.name?a.func=h.name:(i=s.exec(h.toString()))&&(a.func=i[1]),void 0===a.func)try{a.func=i.input.substring(0,i.input.indexOf("{"))}catch(e){}l[""+h]?u=!0:l[""+h]=!0,c.push(a)}o&&c.splice(0,o);var p={name:e.name,message:e.message,url:C(),stack:c};return t(p,e.sourceURL||e.fileName,e.line||e.lineNumber,e.message||e.description),p}function n(t,n){var o=null;n=null==n?0:+n;try{if(o=e(t))return o}catch(e){if(w.debug)throw e}try{if(o=r(t,n+1))return o}catch(e){if(w.debug)throw e}return{name:t.name,message:t.message,url:C()}}return n.augmentStackTraceWithInitialElement=t,n.computeStackTraceFromStackProp=e,n}();var j=w;function R(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function T(e,t,r,n,o,i){return R((a=R(R(t,e),R(n,i)))<<(s=o)|a>>>32-s,r);var a,s}function F(e,t,r,n,o,i,a){return T(t&r|~t&n,e,t,o,i,a)}function D(e,t,r,n,o,i,a){return T(t&n|r&~n,e,t,o,i,a)}function A(e,t,r,n,o,i,a){return T(t^r^n,e,t,o,i,a)}function B(e,t,r,n,o,i,a){return T(r^(t|~n),e,t,o,i,a)}function M(e,t){var r,n,o,i,a;e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;var s=1732584193,c=-271733879,l=-1732584194,u=271733878;for(r=0;r<e.length;r+=16)n=s,o=c,i=l,a=u,s=F(s,c,l,u,e[r],7,-680876936),u=F(u,s,c,l,e[r+1],12,-389564586),l=F(l,u,s,c,e[r+2],17,606105819),c=F(c,l,u,s,e[r+3],22,-1044525330),s=F(s,c,l,u,e[r+4],7,-176418897),u=F(u,s,c,l,e[r+5],12,1200080426),l=F(l,u,s,c,e[r+6],17,-1473231341),c=F(c,l,u,s,e[r+7],22,-45705983),s=F(s,c,l,u,e[r+8],7,1770035416),u=F(u,s,c,l,e[r+9],12,-1958414417),l=F(l,u,s,c,e[r+10],17,-42063),c=F(c,l,u,s,e[r+11],22,-1990404162),s=F(s,c,l,u,e[r+12],7,1804603682),u=F(u,s,c,l,e[r+13],12,-40341101),l=F(l,u,s,c,e[r+14],17,-1502002290),s=D(s,c=F(c,l,u,s,e[r+15],22,1236535329),l,u,e[r+1],5,-165796510),u=D(u,s,c,l,e[r+6],9,-1069501632),l=D(l,u,s,c,e[r+11],14,643717713),c=D(c,l,u,s,e[r],20,-373897302),s=D(s,c,l,u,e[r+5],5,-701558691),u=D(u,s,c,l,e[r+10],9,38016083),l=D(l,u,s,c,e[r+15],14,-660478335),c=D(c,l,u,s,e[r+4],20,-405537848),s=D(s,c,l,u,e[r+9],5,568446438),u=D(u,s,c,l,e[r+14],9,-1019803690),l=D(l,u,s,c,e[r+3],14,-187363961),c=D(c,l,u,s,e[r+8],20,1163531501),s=D(s,c,l,u,e[r+13],5,-1444681467),u=D(u,s,c,l,e[r+2],9,-51403784),l=D(l,u,s,c,e[r+7],14,1735328473),s=A(s,c=D(c,l,u,s,e[r+12],20,-1926607734),l,u,e[r+5],4,-378558),u=A(u,s,c,l,e[r+8],11,-2022574463),l=A(l,u,s,c,e[r+11],16,1839030562),c=A(c,l,u,s,e[r+14],23,-35309556),s=A(s,c,l,u,e[r+1],4,-1530992060),u=A(u,s,c,l,e[r+4],11,1272893353),l=A(l,u,s,c,e[r+7],16,-155497632),c=A(c,l,u,s,e[r+10],23,-1094730640),s=A(s,c,l,u,e[r+13],4,681279174),u=A(u,s,c,l,e[r],11,-358537222),l=A(l,u,s,c,e[r+3],16,-722521979),c=A(c,l,u,s,e[r+6],23,76029189),s=A(s,c,l,u,e[r+9],4,-640364487),u=A(u,s,c,l,e[r+12],11,-421815835),l=A(l,u,s,c,e[r+15],16,530742520),s=B(s,c=A(c,l,u,s,e[r+2],23,-995338651),l,u,e[r],6,-198630844),u=B(u,s,c,l,e[r+7],10,1126891415),l=B(l,u,s,c,e[r+14],15,-1416354905),c=B(c,l,u,s,e[r+5],21,-57434055),s=B(s,c,l,u,e[r+12],6,1700485571),u=B(u,s,c,l,e[r+3],10,-1894986606),l=B(l,u,s,c,e[r+10],15,-1051523),c=B(c,l,u,s,e[r+1],21,-2054922799),s=B(s,c,l,u,e[r+8],6,1873313359),u=B(u,s,c,l,e[r+15],10,-30611744),l=B(l,u,s,c,e[r+6],15,-1560198380),c=B(c,l,u,s,e[r+13],21,1309151649),s=B(s,c,l,u,e[r+4],6,-145523070),u=B(u,s,c,l,e[r+11],10,-1120210379),l=B(l,u,s,c,e[r+2],15,718787259),c=B(c,l,u,s,e[r+9],21,-343485551),s=R(s,n),c=R(c,o),l=R(l,i),u=R(u,a);return[s,c,l,u]}function L(e){var t,r="",n=32*e.length;for(t=0;t<n;t+=8)r+=String.fromCharCode(e[t>>5]>>>t%32&255);return r}function H(e){var t,r=[];for(r[(e.length>>2)-1]=void 0,t=0;t<r.length;t+=1)r[t]=0;var n=8*e.length;for(t=0;t<n;t+=8)r[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return r}function I(e){var t,r,n="";for(r=0;r<e.length;r+=1)t=e.charCodeAt(r),n+="0123456789abcdef".charAt(t>>>4&15)+"0123456789abcdef".charAt(15&t);return n}function P(e){return unescape(encodeURIComponent(e))}function U(e){return function(e){return L(M(H(e),8*e.length))}(P(e))}function N(e,t){return function(e,t){var r,n,o=H(e),i=[],a=[];for(i[15]=a[15]=void 0,o.length>16&&(o=M(o,8*e.length)),r=0;r<16;r+=1)i[r]=909522486^o[r],a[r]=1549556828^o[r];return n=M(i.concat(H(t)),512+8*t.length),L(M(a.concat(n),640))}(P(e),P(t))}var q=function(e,t,r){return t?r?N(t,e):I(N(t,e)):r?U(e):I(U(e))};function z(e){this.name="RavenConfigError",this.message=e}z.prototype=new Error,z.prototype.constructor=z;var K=z,W=function(e,t,r){var n=e[t],o=e;if(t in e){var i="warn"===t?"warning":t;e[t]=function(){var e=[].slice.call(arguments),a=E.safeJoin(e," "),s={level:i,logger:"console",extra:{arguments:e}};"assert"===t?!1===e[0]&&(a="Assertion failed: "+(E.safeJoin(e.slice(1)," ")||"console.assert"),s.extra.arguments=e.slice(1),r&&r(a,s)):r&&r(a,s),n&&Function.prototype.apply.call(n,o,e)}}},V=E.isErrorEvent,$=E.isDOMError,X=E.isDOMException,J=E.isError,G=E.isObject,Y=E.isPlainObject,Z=E.isUndefined,Q=E.isFunction,ee=E.isString,te=E.isArray,re=E.isEmptyObject,ne=E.each,oe=E.objectMerge,ie=E.truncate,ae=E.objectFrozen,se=E.hasKey,ce=E.joinRegExp,le=E.urlencode,ue=E.uuid4,he=E.htmlTreeAsString,pe=E.isSameException,fe=E.isSameStacktrace,de=E.parseUrl,ge=E.fill,me=E.supportsFetch,_e=E.supportsReferrerPolicy,ve=E.serializeKeysForMessage,be=E.serializeException,ye=E.sanitize,Ee=W,we="source protocol user pass host port path".split(" "),xe=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;function ke(){return+new Date}var Se="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},Oe=Se.document,Ce=Se.navigator;function je(e,t){return Q(t)?function(r){return t(r,e)}:t}function Re(){for(var e in this._hasJSON=!("object"!=typeof JSON||!JSON.stringify),this._hasDocument=!Z(Oe),this._hasNavigator=!Z(Ce),this._lastCapturedException=null,this._lastData=null,this._lastEventId=null,this._globalServer=null,this._globalKey=null,this._globalProject=null,this._globalContext={},this._globalOptions={release:Se.SENTRY_RELEASE&&Se.SENTRY_RELEASE.id,logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],headers:null,collectWindowErrors:!0,captureUnhandledRejections:!0,maxMessageLength:0,maxUrlLength:250,stackTraceLimit:50,autoBreadcrumbs:!0,instrument:!0,sampleRate:1,sanitizeKeys:[]},this._fetchDefaults={method:"POST",keepalive:!0,referrerPolicy:_e()?"origin":""},this._ignoreOnError=0,this._isRavenInstalled=!1,this._originalErrorStackTraceLimit=Error.stackTraceLimit,this._originalConsole=Se.console||{},this._originalConsoleMethods={},this._plugins=[],this._startTime=ke(),this._wrappedBuiltIns=[],this._breadcrumbs=[],this._lastCapturedEvent=null,this._keypressTimeout,this._location=Se.location,this._lastHref=this._location&&this._location.href,this._resetBackoff(),this._originalConsole)this._originalConsoleMethods[e]=this._originalConsole[e]}Re.prototype={VERSION:"3.26.4",debug:!1,TraceKit:j,config:function(e,t){var r=this;if(r._globalServer)return this._logDebug("error","Error: Raven has already been configured"),r;if(!e)return r;var n=r._globalOptions;t&&ne(t,function(e,t){"tags"===e||"extra"===e||"user"===e?r._globalContext[e]=t:n[e]=t}),r.setDSN(e),n.ignoreErrors.push(/^Script error\.?$/),n.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),n.ignoreErrors=ce(n.ignoreErrors),n.ignoreUrls=!!n.ignoreUrls.length&&ce(n.ignoreUrls),n.whitelistUrls=!!n.whitelistUrls.length&&ce(n.whitelistUrls),n.includePaths=ce(n.includePaths),n.maxBreadcrumbs=Math.max(0,Math.min(n.maxBreadcrumbs||100,100));var o={xhr:!0,console:!0,dom:!0,location:!0,sentry:!0},i=n.autoBreadcrumbs;"[object Object]"==={}.toString.call(i)?i=oe(o,i):!1!==i&&(i=o),n.autoBreadcrumbs=i;var a={tryCatch:!0},s=n.instrument;return"[object Object]"==={}.toString.call(s)?s=oe(a,s):!1!==s&&(s=a),n.instrument=s,j.collectWindowErrors=!!n.collectWindowErrors,r},install:function(){var e=this;return e.isSetup()&&!e._isRavenInstalled&&(j.report.subscribe(function(){e._handleOnErrorStackInfo.apply(e,arguments)}),e._globalOptions.captureUnhandledRejections&&e._attachPromiseRejectionHandler(),e._patchFunctionToString(),e._globalOptions.instrument&&e._globalOptions.instrument.tryCatch&&e._instrumentTryCatch(),e._globalOptions.autoBreadcrumbs&&e._instrumentBreadcrumbs(),e._drainPlugins(),e._isRavenInstalled=!0),Error.stackTraceLimit=e._globalOptions.stackTraceLimit,this},setDSN:function(e){var t=this._parseDSN(e),r=t.path.lastIndexOf("/"),n=t.path.substr(1,r);this._dsn=e,this._globalKey=t.user,this._globalSecret=t.pass&&t.pass.substr(1),this._globalProject=t.path.substr(r+1),this._globalServer=this._getGlobalServer(t),this._globalEndpoint=this._globalServer+"/"+n+"api/"+this._globalProject+"/store/",this._resetBackoff()},context:function(e,t,r){return Q(e)&&(r=t||[],t=e,e={}),this.wrap(e,t).apply(this,r)},wrap:function(e,t,r){var n=this;if(Z(t)&&!Q(e))return e;if(Q(e)&&(t=e,e=void 0),!Q(t))return t;try{if(t.__raven__)return t;if(t.__raven_wrapper__)return t.__raven_wrapper__}catch(e){return t}function o(){var o=[],i=arguments.length,a=!e||e&&!1!==e.deep;for(r&&Q(r)&&r.apply(this,arguments);i--;)o[i]=a?n.wrap(e,arguments[i]):arguments[i];try{return t.apply(this,o)}catch(t){throw n._ignoreNextOnError(),n.captureException(t,e),t}}for(var i in t)se(t,i)&&(o[i]=t[i]);return o.prototype=t.prototype,t.__raven_wrapper__=o,o.__raven__=!0,o.__orig__=t,o},uninstall:function(){return j.report.uninstall(),this._detachPromiseRejectionHandler(),this._unpatchFunctionToString(),this._restoreBuiltIns(),this._restoreConsole(),Error.stackTraceLimit=this._originalErrorStackTraceLimit,this._isRavenInstalled=!1,this},_promiseRejectionHandler:function(e){this._logDebug("debug","Raven caught unhandled promise rejection:",e),this.captureException(e.reason,{mechanism:{type:"onunhandledrejection",handled:!1}})},_attachPromiseRejectionHandler:function(){return this._promiseRejectionHandler=this._promiseRejectionHandler.bind(this),Se.addEventListener&&Se.addEventListener("unhandledrejection",this._promiseRejectionHandler),this},_detachPromiseRejectionHandler:function(){return Se.removeEventListener&&Se.removeEventListener("unhandledrejection",this._promiseRejectionHandler),this},captureException:function(e,t){if(t=oe({trimHeadFrames:0},t||{}),V(e)&&e.error)e=e.error;else{if($(e)||X(e)){var r=e.name||($(e)?"DOMError":"DOMException"),n=e.message?r+": "+e.message:r;return this.captureMessage(n,oe(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}))}if(J(e))e=e;else{if(!Y(e))return this.captureMessage(e,oe(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}));t=this._getCaptureExceptionOptionsFromPlainObject(t,e),e=new Error(t.message)}}this._lastCapturedException=e;try{var o=j.computeStackTrace(e);this._handleStackInfo(o,t)}catch(t){if(e!==t)throw t}return this},_getCaptureExceptionOptionsFromPlainObject:function(e,t){var r=Object.keys(t).sort(),n=oe(e,{message:"Non-Error exception captured with keys: "+ve(r),fingerprint:[q(r)],extra:e.extra||{}});return n.extra.__serialized__=be(t),n},captureMessage:function(e,t){if(!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(e)){var r,n=oe({message:e+=""},t=t||{});try{throw new Error(e)}catch(e){r=e}r.name=null;var o=j.computeStackTrace(r),i=te(o.stack)&&o.stack[1];i&&"Raven.captureException"===i.func&&(i=o.stack[2]);var a=i&&i.url||"";if((!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(a))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(a))){if(this._globalOptions.stacktrace||t.stacktrace||""===n.message){n.fingerprint=null==n.fingerprint?e:n.fingerprint,(t=oe({trimHeadFrames:0},t)).trimHeadFrames+=1;var s=this._prepareFrames(o,t);n.stacktrace={frames:s.reverse()}}return n.fingerprint&&(n.fingerprint=te(n.fingerprint)?n.fingerprint:[n.fingerprint]),this._send(n),this}}},captureBreadcrumb:function(e){var t=oe({timestamp:ke()/1e3},e);if(Q(this._globalOptions.breadcrumbCallback)){var r=this._globalOptions.breadcrumbCallback(t);if(G(r)&&!re(r))t=r;else if(!1===r)return this}return this._breadcrumbs.push(t),this._breadcrumbs.length>this._globalOptions.maxBreadcrumbs&&this._breadcrumbs.shift(),this},addPlugin:function(e){var t=[].slice.call(arguments,1);return this._plugins.push([e,t]),this._isRavenInstalled&&this._drainPlugins(),this},setUserContext:function(e){return this._globalContext.user=e,this},setExtraContext:function(e){return this._mergeContext("extra",e),this},setTagsContext:function(e){return this._mergeContext("tags",e),this},clearContext:function(){return this._globalContext={},this},getContext:function(){return JSON.parse(r(this._globalContext))},setEnvironment:function(e){return this._globalOptions.environment=e,this},setRelease:function(e){return this._globalOptions.release=e,this},setDataCallback:function(e){var t=this._globalOptions.dataCallback;return this._globalOptions.dataCallback=je(t,e),this},setBreadcrumbCallback:function(e){var t=this._globalOptions.breadcrumbCallback;return this._globalOptions.breadcrumbCallback=je(t,e),this},setShouldSendCallback:function(e){var t=this._globalOptions.shouldSendCallback;return this._globalOptions.shouldSendCallback=je(t,e),this},setTransport:function(e){return this._globalOptions.transport=e,this},lastException:function(){return this._lastCapturedException},lastEventId:function(){return this._lastEventId},isSetup:function(){return!!this._hasJSON&&(!!this._globalServer||(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this._logDebug("error","Error: Raven has not been configured.")),!1))},afterLoad:function(){var e=Se.RavenConfig;e&&this.config(e.dsn,e.config).install()},showReportDialog:function(e){if(Oe){if(!(e=Object.assign({eventId:this.lastEventId(),dsn:this._dsn,user:this._globalContext.user||{}},e)).eventId)throw new K("Missing eventId");if(!e.dsn)throw new K("Missing DSN");var t=encodeURIComponent,r=[];for(var n in e)if("user"===n){var o=e.user;o.name&&r.push("name="+t(o.name)),o.email&&r.push("email="+t(o.email))}else r.push(t(n)+"="+t(e[n]));var i=this._getGlobalServer(this._parseDSN(e.dsn)),a=Oe.createElement("script");a.async=!0,a.src=i+"/api/embed/error-page/?"+r.join("&"),(Oe.head||Oe.body).appendChild(a)}},_ignoreNextOnError:function(){var e=this;this._ignoreOnError+=1,setTimeout(function(){e._ignoreOnError-=1})},_triggerEvent:function(e,t){var r,n;if(this._hasDocument){for(n in t=t||{},e="raven"+e.substr(0,1).toUpperCase()+e.substr(1),Oe.createEvent?(r=Oe.createEvent("HTMLEvents")).initEvent(e,!0,!0):(r=Oe.createEventObject()).eventType=e,t)se(t,n)&&(r[n]=t[n]);if(Oe.createEvent)Oe.dispatchEvent(r);else try{Oe.fireEvent("on"+r.eventType.toLowerCase(),r)}catch(e){}}},_breadcrumbEventHandler:function(e){var t=this;return function(r){if(t._keypressTimeout=null,t._lastCapturedEvent!==r){var n;t._lastCapturedEvent=r;try{n=he(r.target)}catch(e){n="<unknown>"}t.captureBreadcrumb({category:"ui."+e,message:n})}}},_keypressEventHandler:function(){var e=this;return function(t){var r;try{r=t.target}catch(e){return}var n=r&&r.tagName;if(n&&("INPUT"===n||"TEXTAREA"===n||r.isContentEditable)){var o=e._keypressTimeout;o||e._breadcrumbEventHandler("input")(t),clearTimeout(o),e._keypressTimeout=setTimeout(function(){e._keypressTimeout=null},1e3)}}},_captureUrlChange:function(e,t){var r=de(this._location.href),n=de(t),o=de(e);this._lastHref=t,r.protocol===n.protocol&&r.host===n.host&&(t=n.relative),r.protocol===o.protocol&&r.host===o.host&&(e=o.relative),this.captureBreadcrumb({category:"navigation",data:{to:t,from:e}})},_patchFunctionToString:function(){var e=this;e._originalFunctionToString=Function.prototype.toString,Function.prototype.toString=function(){return"function"==typeof this&&this.__raven__?e._originalFunctionToString.apply(this.__orig__,arguments):e._originalFunctionToString.apply(this,arguments)}},_unpatchFunctionToString:function(){this._originalFunctionToString&&(Function.prototype.toString=this._originalFunctionToString)},_instrumentTryCatch:function(){var e=this,t=e._wrappedBuiltIns;function r(t){return function(r,n){for(var o=new Array(arguments.length),i=0;i<o.length;++i)o[i]=arguments[i];var a=o[0];return Q(a)&&(o[0]=e.wrap({mechanism:{type:"instrument",data:{function:t.name||"<anonymous>"}}},a)),t.apply?t.apply(this,o):t(o[0],o[1])}}var n=this._globalOptions.autoBreadcrumbs;function o(r){var o=Se[r]&&Se[r].prototype;o&&o.hasOwnProperty&&o.hasOwnProperty("addEventListener")&&(ge(o,"addEventListener",function(t){return function(o,i,a,s){try{i&&i.handleEvent&&(i.handleEvent=e.wrap({mechanism:{type:"instrument",data:{target:r,function:"handleEvent",handler:i&&i.name||"<anonymous>"}}},i.handleEvent))}catch(e){}var c,l,u;return n&&n.dom&&("EventTarget"===r||"Node"===r)&&(l=e._breadcrumbEventHandler("click"),u=e._keypressEventHandler(),c=function(e){if(e){var t;try{t=e.type}catch(e){return}return"click"===t?l(e):"keypress"===t?u(e):void 0}}),t.call(this,o,e.wrap({mechanism:{type:"instrument",data:{target:r,function:"addEventListener",handler:i&&i.name||"<anonymous>"}}},i,c),a,s)}},t),ge(o,"removeEventListener",function(e){return function(t,r,n,o){try{r=r&&(r.__raven_wrapper__?r.__raven_wrapper__:r)}catch(e){}return e.call(this,t,r,n,o)}},t))}ge(Se,"setTimeout",r,t),ge(Se,"setInterval",r,t),Se.requestAnimationFrame&&ge(Se,"requestAnimationFrame",function(t){return function(r){return t(e.wrap({mechanism:{type:"instrument",data:{function:"requestAnimationFrame",handler:t&&t.name||"<anonymous>"}}},r))}},t);for(var i=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],a=0;a<i.length;a++)o(i[a])},_instrumentBreadcrumbs:function(){var e=this,t=this._globalOptions.autoBreadcrumbs,r=e._wrappedBuiltIns;function n(t,r){t in r&&Q(r[t])&&ge(r,t,function(r){return e.wrap({mechanism:{type:"instrument",data:{function:t,handler:r&&r.name||"<anonymous>"}}},r)})}if(t.xhr&&"XMLHttpRequest"in Se){var o=Se.XMLHttpRequest&&Se.XMLHttpRequest.prototype;ge(o,"open",function(t){return function(r,n){return ee(n)&&-1===n.indexOf(e._globalKey)&&(this.__raven_xhr={method:r,url:n,status_code:null}),t.apply(this,arguments)}},r),ge(o,"send",function(t){return function(){var r=this;function o(){if(r.__raven_xhr&&4===r.readyState){try{r.__raven_xhr.status_code=r.status}catch(e){}e.captureBreadcrumb({type:"http",category:"xhr",data:r.__raven_xhr})}}for(var i=["onload","onerror","onprogress"],a=0;a<i.length;a++)n(i[a],r);return"onreadystatechange"in r&&Q(r.onreadystatechange)?ge(r,"onreadystatechange",function(t){return e.wrap({mechanism:{type:"instrument",data:{function:"onreadystatechange",handler:t&&t.name||"<anonymous>"}}},t,o)}):r.onreadystatechange=o,t.apply(this,arguments)}},r)}t.xhr&&me()&&ge(Se,"fetch",function(t){return function(){for(var r=new Array(arguments.length),n=0;n<r.length;++n)r[n]=arguments[n];var o,i=r[0],a="GET";if("string"==typeof i?o=i:"Request"in Se&&i instanceof Se.Request?(o=i.url,i.method&&(a=i.method)):o=""+i,-1!==o.indexOf(e._globalKey))return t.apply(this,r);r[1]&&r[1].method&&(a=r[1].method);var s={method:a,url:o,status_code:null};return t.apply(this,r).then(function(t){return s.status_code=t.status,e.captureBreadcrumb({type:"http",category:"fetch",data:s}),t}).catch(function(t){throw e.captureBreadcrumb({type:"http",category:"fetch",data:s,level:"error"}),t})}},r),t.dom&&this._hasDocument&&(Oe.addEventListener?(Oe.addEventListener("click",e._breadcrumbEventHandler("click"),!1),Oe.addEventListener("keypress",e._keypressEventHandler(),!1)):Oe.attachEvent&&(Oe.attachEvent("onclick",e._breadcrumbEventHandler("click")),Oe.attachEvent("onkeypress",e._keypressEventHandler())));var i=Se.chrome,a=!(i&&i.app&&i.app.runtime)&&Se.history&&Se.history.pushState&&Se.history.replaceState;if(t.location&&a){var s=Se.onpopstate;Se.onpopstate=function(){var t=e._location.href;if(e._captureUrlChange(e._lastHref,t),s)return s.apply(this,arguments)};var c=function(t){return function(){var r=arguments.length>2?arguments[2]:void 0;return r&&e._captureUrlChange(e._lastHref,r+""),t.apply(this,arguments)}};ge(Se.history,"pushState",c,r),ge(Se.history,"replaceState",c,r)}if(t.console&&"console"in Se&&console.log){var l=function(t,r){e.captureBreadcrumb({message:t,level:r.level,category:"console"})};ne(["debug","info","warn","error","log"],function(e,t){Ee(console,t,l)})}},_restoreBuiltIns:function(){for(var e;this._wrappedBuiltIns.length;){var t=(e=this._wrappedBuiltIns.shift())[0],r=e[1],n=e[2];t[r]=n}},_restoreConsole:function(){for(var e in this._originalConsoleMethods)this._originalConsole[e]=this._originalConsoleMethods[e]},_drainPlugins:function(){var e=this;ne(this._plugins,function(t,r){var n=r[0],o=r[1];n.apply(e,[e].concat(o))})},_parseDSN:function(e){var t=xe.exec(e),r={},n=7;try{for(;n--;)r[we[n]]=t[n]||""}catch(t){throw new K("Invalid DSN: "+e)}if(r.pass&&!this._globalOptions.allowSecretKey)throw new K("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");return r},_getGlobalServer:function(e){var t="//"+e.host+(e.port?":"+e.port:"");return e.protocol&&(t=e.protocol+":"+t),t},_handleOnErrorStackInfo:function(e,t){(t=t||{}).mechanism=t.mechanism||{type:"onerror",handled:!1},this._ignoreOnError||this._handleStackInfo(e,t)},_handleStackInfo:function(e,t){var r=this._prepareFrames(e,t);this._triggerEvent("handle",{stackInfo:e,options:t}),this._processException(e.name,e.message,e.url,e.lineno,r,t)},_prepareFrames:function(e,t){var r=this,n=[];if(e.stack&&e.stack.length&&(ne(e.stack,function(t,o){var i=r._normalizeFrame(o,e.url);i&&n.push(i)}),t&&t.trimHeadFrames))for(var o=0;o<t.trimHeadFrames&&o<n.length;o++)n[o].in_app=!1;return n=n.slice(0,this._globalOptions.stackTraceLimit)},_normalizeFrame:function(e,t){var r={filename:e.url,lineno:e.line,colno:e.column,function:e.func||"?"};return e.url||(r.filename=t),r.in_app=!(this._globalOptions.includePaths.test&&!this._globalOptions.includePaths.test(r.filename)||/(Raven|TraceKit)\./.test(r.function)||/raven\.(min\.)?js$/.test(r.filename)),r},_processException:function(e,t,r,n,o,i){var a,s=(e?e+": ":"")+(t||"");if((!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(t)&&!this._globalOptions.ignoreErrors.test(s))&&(o&&o.length?(r=o[0].filename||r,o.reverse(),a={frames:o}):r&&(a={frames:[{filename:r,lineno:n,in_app:!0}]}),(!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(r))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(r)))){var c=oe({exception:{values:[{type:e,value:t,stacktrace:a}]},transaction:r},i),l=c.exception.values[0];null==l.type&&""===l.value&&(l.value="Unrecoverable error caught"),!c.exception.mechanism&&c.mechanism&&(c.exception.mechanism=c.mechanism,delete c.mechanism),c.exception.mechanism=oe({type:"generic",handled:!0},c.exception.mechanism||{}),this._send(c)}},_trimPacket:function(e){var t=this._globalOptions.maxMessageLength;if(e.message&&(e.message=ie(e.message,t)),e.exception){var r=e.exception.values[0];r.value=ie(r.value,t)}var n=e.request;return n&&(n.url&&(n.url=ie(n.url,this._globalOptions.maxUrlLength)),n.Referer&&(n.Referer=ie(n.Referer,this._globalOptions.maxUrlLength))),e.breadcrumbs&&e.breadcrumbs.values&&this._trimBreadcrumbs(e.breadcrumbs),e},_trimBreadcrumbs:function(e){for(var t,r,n,o=["to","from","url"],i=0;i<e.values.length;++i)if((r=e.values[i]).hasOwnProperty("data")&&G(r.data)&&!ae(r.data)){n=oe({},r.data);for(var a=0;a<o.length;++a)t=o[a],n.hasOwnProperty(t)&&n[t]&&(n[t]=ie(n[t],this._globalOptions.maxUrlLength));e.values[i].data=n}},_getHttpData:function(){if(this._hasNavigator||this._hasDocument){var e={};return this._hasNavigator&&Ce.userAgent&&(e.headers={"User-Agent":Ce.userAgent}),Se.location&&Se.location.href&&(e.url=Se.location.href),this._hasDocument&&Oe.referrer&&(e.headers||(e.headers={}),e.headers.Referer=Oe.referrer),e}},_resetBackoff:function(){this._backoffDuration=0,this._backoffStart=null},_shouldBackoff:function(){return this._backoffDuration&&ke()-this._backoffStart<this._backoffDuration},_isRepeatData:function(e){var t=this._lastData;return!(!t||e.message!==t.message||e.transaction!==t.transaction)&&(e.stacktrace||t.stacktrace?fe(e.stacktrace,t.stacktrace):!e.exception&&!t.exception||pe(e.exception,t.exception))},_setBackoffState:function(e){if(!this._shouldBackoff()){var t=e.status;if(400===t||401===t||429===t){var r;try{r=me()?e.headers.get("Retry-After"):e.getResponseHeader("Retry-After"),r=1e3*parseInt(r,10)}catch(e){}this._backoffDuration=r||(2*this._backoffDuration||1e3),this._backoffStart=ke()}}},_send:function(e){var t=this._globalOptions,r={project:this._globalProject,logger:t.logger,platform:"javascript"},n=this._getHttpData();n&&(r.request=n),e.trimHeadFrames&&delete e.trimHeadFrames,(e=oe(r,e)).tags=oe(oe({},this._globalContext.tags),e.tags),e.extra=oe(oe({},this._globalContext.extra),e.extra),e.extra["session:duration"]=ke()-this._startTime,this._breadcrumbs&&this._breadcrumbs.length>0&&(e.breadcrumbs={values:[].slice.call(this._breadcrumbs,0)}),this._globalContext.user&&(e.user=this._globalContext.user),t.environment&&(e.environment=t.environment),t.release&&(e.release=t.release),t.serverName&&(e.server_name=t.serverName),e=this._sanitizeData(e),Object.keys(e).forEach(function(t){(null==e[t]||""===e[t]||re(e[t]))&&delete e[t]}),Q(t.dataCallback)&&(e=t.dataCallback(e)||e),e&&!re(e)&&(Q(t.shouldSendCallback)&&!t.shouldSendCallback(e)||(this._shouldBackoff()?this._logDebug("warn","Raven dropped error due to backoff: ",e):"number"==typeof t.sampleRate?Math.random()<t.sampleRate&&this._sendProcessedPayload(e):this._sendProcessedPayload(e)))},_sanitizeData:function(e){return ye(e,this._globalOptions.sanitizeKeys)},_getUuid:function(){return ue()},_sendProcessedPayload:function(e,t){var r=this,n=this._globalOptions;if(this.isSetup())if(e=this._trimPacket(e),this._globalOptions.allowDuplicates||!this._isRepeatData(e)){this._lastEventId=e.event_id||(e.event_id=this._getUuid()),this._lastData=e,this._logDebug("debug","Raven about to send:",e);var o={sentry_version:"7",sentry_client:"raven-js/"+this.VERSION,sentry_key:this._globalKey};this._globalSecret&&(o.sentry_secret=this._globalSecret);var i=e.exception&&e.exception.values[0];this._globalOptions.autoBreadcrumbs&&this._globalOptions.autoBreadcrumbs.sentry&&this.captureBreadcrumb({category:"sentry",message:i?(i.type?i.type+": ":"")+i.value:e.message,event_id:e.event_id,level:e.level||"error"});var a=this._globalEndpoint;(n.transport||this._makeRequest).call(this,{url:a,auth:o,data:e,options:n,onSuccess:function(){r._resetBackoff(),r._triggerEvent("success",{data:e,src:a}),t&&t()},onError:function(n){r._logDebug("error","Raven transport failed to send: ",n),n.request&&r._setBackoffState(n.request),r._triggerEvent("failure",{data:e,src:a}),n=n||new Error("Raven send failed (no additional details provided)"),t&&t(n)}})}else this._logDebug("warn","Raven dropped repeat event: ",e)},_makeRequest:function(e){var t=e.url+"?"+le(e.auth),n=null,o={};if(e.options.headers&&(n=this._evaluateHash(e.options.headers)),e.options.fetchParameters&&(o=this._evaluateHash(e.options.fetchParameters)),me()){o.body=r(e.data);var i=oe({},this._fetchDefaults),a=oe(i,o);return n&&(a.headers=n),Se.fetch(t,a).then(function(t){if(t.ok)e.onSuccess&&e.onSuccess();else{var r=new Error("Sentry error code: "+t.status);r.request=t,e.onError&&e.onError(r)}}).catch(function(){e.onError&&e.onError(new Error("Sentry error code: network unavailable"))})}var s=Se.XMLHttpRequest&&new Se.XMLHttpRequest;s&&(("withCredentials"in s||"undefined"!=typeof XDomainRequest)&&("withCredentials"in s?s.onreadystatechange=function(){if(4===s.readyState)if(200===s.status)e.onSuccess&&e.onSuccess();else if(e.onError){var t=new Error("Sentry error code: "+s.status);t.request=s,e.onError(t)}}:(s=new XDomainRequest,t=t.replace(/^https?:/,""),e.onSuccess&&(s.onload=e.onSuccess),e.onError&&(s.onerror=function(){var t=new Error("Sentry error code: XDomainRequest");t.request=s,e.onError(t)})),s.open("POST",t),n&&ne(n,function(e,t){s.setRequestHeader(e,t)}),s.send(r(e.data))))},_evaluateHash:function(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];t[r]="function"==typeof n?n():n}return t},_logDebug:function(e){this._originalConsoleMethods[e]&&(this.debug||this._globalOptions.debug)&&Function.prototype.apply.call(this._originalConsoleMethods[e],this._originalConsole,[].slice.call(arguments,1))},_mergeContext:function(e,t){Z(t)?delete this._globalContext[e]:this._globalContext[e]=oe(this._globalContext[e]||{},t)}},Re.prototype.setUser=Re.prototype.setUserContext,Re.prototype.setReleaseContext=Re.prototype.setRelease;var Te=Re,Fe="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},De=Fe.Raven,Ae=new Te;Ae.noConflict=function(){return Fe.Raven=De,Ae},Ae.afterLoad();var Be,Me,Le,He,Ie,Pe,Ue,Ne,qe=Ae,ze=Te;qe.Client=ze,Ue=window.location.host,Ne={prod:"plyr.io"===Ue,dev:"dev.plyr.io"===Ue},document.addEventListener("DOMContentLoaded",function(){qe.context(function(){var e=document.getElementById("container");window.shr&&window.shr.setup({count:{classname:"button__count"}}),document.addEventListener("focusout",function(t){t.target.classList&&!e.contains(t.target)&&t.target.classList.remove("tab-focus")}),document.addEventListener("keydown",function(t){9===t.keyCode&&setTimeout(function(){var t=document.activeElement;t&&t.classList&&!e.contains(t)&&t.classList.add("tab-focus")},10)});var t=new Plyr("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"../dist/plyr.svg",keyboard:{global:!0},tooltips:{controls:!0},captions:{active:!0},keys:{google:"AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c"},ads:{enabled:Ne.prod||Ne.dev,publisherId:"918848828995742"}});window.player=t;var r=document.querySelectorAll("[data-source]"),n={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},o=window.location.hash.replace("#",""),i=window.history&&window.history.pushState;function a(e,t,r){e&&e.classList[r?"add":"remove"](t)}function s(e,i){if(e in n&&(i||e!==o)&&(o.length||e!==n.video)){switch(e){case n.video:t.source={type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4",type:"video/mp4",size:576},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4",type:"video/mp4",size:720},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4",type:"video/mp4",size:1080},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4",type:"video/mp4",size:1440}],poster:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt",default:!0},{kind:"captions",label:"French",srclang:"fr",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt"}]};break;case n.audio:t.source={type:"audio",title:"Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;",sources:[{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]};break;case n.youtube:t.source={type:"video",sources:[{src:"https://youtube.com/watch?v=bTqVqk7FSmY",provider:"youtube"}]};break;case n.vimeo:t.source={type:"video",sources:[{src:"https://vimeo.com/76979871",provider:"vimeo"}]}}o=e,Array.from(r).forEach(function(e){return a(e.parentElement,"active",!1)}),a(document.querySelector('[data-source="'+e+'"]'),"active",!0),Array.from(document.querySelectorAll(".plyr__cite")).forEach(function(e){e.setAttribute("hidden","")}),document.querySelector(".plyr__cite--"+e).removeAttribute("hidden")}}if(Array.from(r).forEach(function(e){e.addEventListener("click",function(){var t=e.getAttribute("data-source");s(t),i&&window.history.pushState({type:t},"","#"+t)})}),window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&s(e.state.type)}),i){var c=!o.length;c&&(o=n.video),o in n&&window.history.replaceState({type:o},"",c?"":"#"+o),o!==n.video&&s(o,!0)}})}),Ne.prod&&qe.config("https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555").install(),Ne.prod&&(Be=window,Me=document,Le="script",He="ga",Be.GoogleAnalyticsObject=He,Be.ga=Be.ga||function(){(Be.ga.q=Be.ga.q||[]).push(arguments)},Be.ga.l=1*new Date,Ie=Me.createElement(Le),Pe=Me.getElementsByTagName(Le)[0],Ie.async=1,Ie.src="https://www.google-analytics.com/analytics.js",Pe.parentNode.insertBefore(Ie,Pe),window.ga("create","UA-40881672-11","auto"),window.ga("send","pageview"))}();
+"object"==typeof navigator&&function(){"use strict";var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var t,r=(function(e,t){function r(e,t){for(var r=0;r<e.length;++r)if(e[r]===t)return r;return-1}function n(e,t){var n=[],o=[];return null==t&&(t=function(e,t){return n[0]===t?"[Circular ~]":"[Circular ~."+o.slice(0,r(n,t)).join(".")+"]"}),function(i,a){if(n.length>0){var s=r(n,this);~s?n.splice(s+1):n.push(this),~s?o.splice(s,1/0,i):o.push(i),~r(n,a)&&(a=t.call(this,i,a))}else n.push(a);return null==e?a instanceof Error?function(e){var t={stack:e.stack,message:e.message,name:e.name};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(a):a:e.call(this,i,a)}}(e.exports=function(e,t,r,o){return JSON.stringify(e,n(t,o),r)}).getSerialize=n}(t={exports:{}},t.exports),t.exports),n=(r.getSerialize,"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{});function o(e){return void 0===e}function i(e){return"[object Object]"===Object.prototype.toString.call(e)}function a(e){return"[object String]"===Object.prototype.toString.call(e)}function s(e){return"[object Array]"===Object.prototype.toString.call(e)}function c(){if(!("fetch"in n))return!1;try{return new Headers,new Request(""),new Response,!0}catch(e){return!1}}function l(e,t){var r,n;if(o(e.length))for(r in e)h(e,r)&&t.call(null,r,e[r]);else if(n=e.length)for(r=0;r<n;r++)t.call(null,r,e[r])}function u(e,t){if("number"!=typeof t)throw new Error("2nd argument to `truncate` function should be a number");return"string"!=typeof e||0===t?e:e.length<=t?e:e.substr(0,t)+"…"}function h(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function p(e){for(var t,r=[],n=0,o=e.length;n<o;n++)a(t=e[n])?r.push(t.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")):t&&t.source&&r.push(t.source);return new RegExp(r.join("|"),"i")}function f(e){var t,r,n,o,i,s=[];if(!e||!e.tagName)return"";if(s.push(e.tagName.toLowerCase()),e.id&&s.push("#"+e.id),(t=e.className)&&a(t))for(r=t.split(/\s+/),i=0;i<r.length;i++)s.push("."+r[i]);var c=["type","name","title","alt"];for(i=0;i<c.length;i++)n=c[i],(o=e.getAttribute(n))&&s.push("["+n+'="'+o+'"]');return s.join("")}function d(e,t){return!!(!!e^!!t)}function g(e,t){if(d(e,t))return!1;var r,n,o=e.frames,i=t.frames;if(void 0===o||void 0===i)return!1;if(o.length!==i.length)return!1;for(var a=0;a<o.length;a++)if(r=o[a],n=i[a],r.filename!==n.filename||r.lineno!==n.lineno||r.colno!==n.colno||r.function!==n.function)return!1;return!0}var m=3,_=51200,v=40;function b(e){return function(e){return~-encodeURI(e).split(/%..|./).length}(JSON.stringify(e))}function y(e){if("string"==typeof e){return u(e,40)}if("number"==typeof e||"boolean"==typeof e||void 0===e)return e;var t=Object.prototype.toString.call(e);return"[object Object]"===t?"[Object]":"[object Array]"===t?"[Array]":"[object Function]"===t?e.name?"[Function: "+e.name+"]":"[Function]":e}var E={isObject:function(e){return"object"==typeof e&&null!==e},isError:function(e){switch(Object.prototype.toString.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return e instanceof Error}},isErrorEvent:function(e){return"[object ErrorEvent]"===Object.prototype.toString.call(e)},isDOMError:function(e){return"[object DOMError]"===Object.prototype.toString.call(e)},isDOMException:function(e){return"[object DOMException]"===Object.prototype.toString.call(e)},isUndefined:o,isFunction:function(e){return"function"==typeof e},isPlainObject:i,isString:a,isArray:s,isEmptyObject:function(e){if(!i(e))return!1;for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},supportsErrorEvent:function(){try{return new ErrorEvent(""),!0}catch(e){return!1}},supportsDOMError:function(){try{return new DOMError(""),!0}catch(e){return!1}},supportsDOMException:function(){try{return new DOMException(""),!0}catch(e){return!1}},supportsFetch:c,supportsReferrerPolicy:function(){if(!c())return!1;try{return new Request("pickleRick",{referrerPolicy:"origin"}),!0}catch(e){return!1}},supportsPromiseRejectionEvent:function(){return"function"==typeof PromiseRejectionEvent},wrappedCallback:function(e){return function(t,r){var n=e(t)||t;return r&&r(n)||n}},each:l,objectMerge:function(e,t){return t?(l(t,function(t,r){e[t]=r}),e):e},truncate:u,objectFrozen:function(e){return!!Object.isFrozen&&Object.isFrozen(e)},hasKey:h,joinRegExp:p,urlencode:function(e){var t=[];return l(e,function(e,r){t.push(encodeURIComponent(e)+"="+encodeURIComponent(r))}),t.join("&")},uuid4:function(){var e=n.crypto||n.msCrypto;if(!o(e)&&e.getRandomValues){var t=new Uint16Array(8);e.getRandomValues(t),t[3]=4095&t[3]|16384,t[4]=16383&t[4]|32768;var r=function(e){for(var t=e.toString(16);t.length<4;)t="0"+t;return t};return r(t[0])+r(t[1])+r(t[2])+r(t[3])+r(t[4])+r(t[5])+r(t[6])+r(t[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})},htmlTreeAsString:function(e){for(var t,r=[],n=0,o=0,i=" > ".length;e&&n++<5&&!("html"===(t=f(e))||n>1&&o+r.length*i+t.length>=80);)r.push(t),o+=t.length,e=e.parentNode;return r.reverse().join(" > ")},htmlElementAsString:f,isSameException:function(e,t){return!d(e,t)&&(e=e.values[0],t=t.values[0],e.type===t.type&&e.value===t.value&&(r=e.stacktrace,n=t.stacktrace,(!o(r)||!o(n))&&g(e.stacktrace,t.stacktrace)));var r,n},isSameStacktrace:g,parseUrl:function(e){if("string"!=typeof e)return{};var t=e.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/),r=t[6]||"",n=t[8]||"";return{protocol:t[2],host:t[4],path:t[5],relative:t[5]+r+n}},fill:function(e,t,r,n){if(null!=e){var o=e[t];e[t]=r(o),e[t].__raven__=!0,e[t].__orig__=o,n&&n.push([e,t,o])}},safeJoin:function(e,t){if(!s(e))return"";for(var r=[],n=0;n<e.length;n++)try{r.push(String(e[n]))}catch(e){r.push("[value cannot be serialized]")}return r.join(t)},serializeException:function e(t,n,o){if(!i(t))return t;o="number"!=typeof(n="number"!=typeof n?m:n)?_:o;var a=function e(t,r){return 0===r?y(t):i(t)?Object.keys(t).reduce(function(n,o){return n[o]=e(t[o],r-1),n},{}):Array.isArray(t)?t.map(function(t){return e(t,r-1)}):y(t)}(t,n);return b(r(a))>o?e(t,n-1):a},serializeKeysForMessage:function(e,t){if("number"==typeof e||"string"==typeof e)return e.toString();if(!Array.isArray(e))return"";if(0===(e=e.filter(function(e){return"string"==typeof e})).length)return"[object has no keys]";if(t="number"!=typeof t?v:t,e[0].length>=t)return e[0];for(var r=e.length;r>0;r--){var n=e.slice(0,r).join(", ");if(!(n.length>t))return r===e.length?n:n+"…"}return""},sanitize:function(e,t){if(!s(t)||s(t)&&0===t.length)return e;var n,o=p(t),a="********";try{n=JSON.parse(r(e))}catch(t){return e}return function e(t){return s(t)?t.map(function(t){return e(t)}):i(t)?Object.keys(t).reduce(function(r,n){return o.test(n)?r[n]=a:r[n]=e(t[n]),r},{}):t}(n)}},w={collectWindowErrors:!0,debug:!1},x="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},k=[].slice,S="?",O=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;function C(){return"undefined"==typeof document||null==document.location?"":document.location.href}w.report=function(){var e,t,r=[],n=null,o=null,i=null;function a(e,t){var n=null;if(!t||w.collectWindowErrors){for(var o in r)if(r.hasOwnProperty(o))try{r[o].apply(null,[e].concat(k.call(arguments,2)))}catch(e){n=e}if(n)throw n}}function s(t,r,n,o,s){var l=E.isErrorEvent(s)?s.error:s,u=E.isErrorEvent(t)?t.message:t;if(i)w.computeStackTrace.augmentStackTraceWithInitialElement(i,r,n,u),c();else if(l&&E.isError(l))a(w.computeStackTrace(l),!0);else{var h,p={url:r,line:n,column:o},f=void 0;if("[object String]"==={}.toString.call(u))(h=u.match(O))&&(f=h[1],u=h[2]);p.func=S,a({name:f,message:u,url:C(),stack:[p]},!0)}return!!e&&e.apply(this,arguments)}function c(){var e=i,t=n;n=null,i=null,o=null,a.apply(null,[e,!1].concat(t))}function l(e,t){var r=k.call(arguments,1);if(i){if(o===e)return;c()}var a=w.computeStackTrace(e);if(i=a,o=e,n=r,setTimeout(function(){o===e&&c()},a.incomplete?2e3:0),!1!==t)throw e}return l.subscribe=function(n){t||(e=x.onerror,x.onerror=s,t=!0),r.push(n)},l.unsubscribe=function(e){for(var t=r.length-1;t>=0;--t)r[t]===e&&r.splice(t,1)},l.uninstall=function(){t&&(x.onerror=e,t=!1,e=void 0),r=[]},l}(),w.computeStackTrace=function(){function e(e){if(void 0!==e.stack&&e.stack){for(var t,r,n,o=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,i=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,a=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i,s=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,c=/\((\S*)(?::(\d+))(?::(\d+))\)/,l=e.stack.split("\n"),u=[],h=(/^(.*) is undefined$/.exec(e.message),0),p=l.length;h<p;++h){if(r=o.exec(l[h])){var f=r[2]&&0===r[2].indexOf("native");r[2]&&0===r[2].indexOf("eval")&&(t=c.exec(r[2]))&&(r[2]=t[1],r[3]=t[2],r[4]=t[3]),n={url:f?null:r[2],func:r[1]||S,args:f?[r[2]]:[],line:r[3]?+r[3]:null,column:r[4]?+r[4]:null}}else if(r=i.exec(l[h]))n={url:r[2],func:r[1]||S,args:[],line:+r[3],column:r[4]?+r[4]:null};else{if(!(r=a.exec(l[h])))continue;r[3]&&r[3].indexOf(" > eval")>-1&&(t=s.exec(r[3]))?(r[3]=t[1],r[4]=t[2],r[5]=null):0!==h||r[5]||void 0===e.columnNumber||(u[0].column=e.columnNumber+1),n={url:r[3],func:r[1]||S,args:r[2]?r[2].split(","):[],line:r[4]?+r[4]:null,column:r[5]?+r[5]:null}}if(!n.func&&n.line&&(n.func=S),n.url&&"blob:"===n.url.substr(0,5)){var d=new XMLHttpRequest;if(d.open("GET",n.url,!1),d.send(null),200===d.status){var g=d.responseText||"",m=(g=g.slice(-300)).match(/\/\/# sourceMappingURL=(.*)$/);if(m){var _=m[1];"~"===_.charAt(0)&&(_=("undefined"==typeof document||null==document.location?"":document.location.origin?document.location.origin:document.location.protocol+"//"+document.location.hostname+(document.location.port?":"+document.location.port:""))+_.slice(1)),n.url=_.slice(0,-4)}}}u.push(n)}return u.length?{name:e.name,message:e.message,url:C(),stack:u}:null}}function t(e,t,r,n){var o={url:t,line:r};if(o.url&&o.line){if(e.incomplete=!1,o.func||(o.func=S),e.stack.length>0&&e.stack[0].url===o.url){if(e.stack[0].line===o.line)return!1;if(!e.stack[0].line&&e.stack[0].func===o.func)return e.stack[0].line=o.line,!1}return e.stack.unshift(o),e.partial=!0,!0}return e.incomplete=!0,!1}function r(e,o){for(var i,a,s=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,c=[],l={},u=!1,h=r.caller;h&&!u;h=h.caller)if(h!==n&&h!==w.report){if(a={url:null,func:S,line:null,column:null},h.name?a.func=h.name:(i=s.exec(h.toString()))&&(a.func=i[1]),void 0===a.func)try{a.func=i.input.substring(0,i.input.indexOf("{"))}catch(e){}l[""+h]?u=!0:l[""+h]=!0,c.push(a)}o&&c.splice(0,o);var p={name:e.name,message:e.message,url:C(),stack:c};return t(p,e.sourceURL||e.fileName,e.line||e.lineNumber,e.message||e.description),p}function n(t,n){var o=null;n=null==n?0:+n;try{if(o=e(t))return o}catch(e){if(w.debug)throw e}try{if(o=r(t,n+1))return o}catch(e){if(w.debug)throw e}return{name:t.name,message:t.message,url:C()}}return n.augmentStackTraceWithInitialElement=t,n.computeStackTraceFromStackProp=e,n}();var j=w;function R(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function T(e,t,r,n,o,i){return R((a=R(R(t,e),R(n,i)))<<(s=o)|a>>>32-s,r);var a,s}function F(e,t,r,n,o,i,a){return T(t&r|~t&n,e,t,o,i,a)}function D(e,t,r,n,o,i,a){return T(t&n|r&~n,e,t,o,i,a)}function A(e,t,r,n,o,i,a){return T(t^r^n,e,t,o,i,a)}function B(e,t,r,n,o,i,a){return T(r^(t|~n),e,t,o,i,a)}function M(e,t){var r,n,o,i,a;e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;var s=1732584193,c=-271733879,l=-1732584194,u=271733878;for(r=0;r<e.length;r+=16)n=s,o=c,i=l,a=u,s=F(s,c,l,u,e[r],7,-680876936),u=F(u,s,c,l,e[r+1],12,-389564586),l=F(l,u,s,c,e[r+2],17,606105819),c=F(c,l,u,s,e[r+3],22,-1044525330),s=F(s,c,l,u,e[r+4],7,-176418897),u=F(u,s,c,l,e[r+5],12,1200080426),l=F(l,u,s,c,e[r+6],17,-1473231341),c=F(c,l,u,s,e[r+7],22,-45705983),s=F(s,c,l,u,e[r+8],7,1770035416),u=F(u,s,c,l,e[r+9],12,-1958414417),l=F(l,u,s,c,e[r+10],17,-42063),c=F(c,l,u,s,e[r+11],22,-1990404162),s=F(s,c,l,u,e[r+12],7,1804603682),u=F(u,s,c,l,e[r+13],12,-40341101),l=F(l,u,s,c,e[r+14],17,-1502002290),s=D(s,c=F(c,l,u,s,e[r+15],22,1236535329),l,u,e[r+1],5,-165796510),u=D(u,s,c,l,e[r+6],9,-1069501632),l=D(l,u,s,c,e[r+11],14,643717713),c=D(c,l,u,s,e[r],20,-373897302),s=D(s,c,l,u,e[r+5],5,-701558691),u=D(u,s,c,l,e[r+10],9,38016083),l=D(l,u,s,c,e[r+15],14,-660478335),c=D(c,l,u,s,e[r+4],20,-405537848),s=D(s,c,l,u,e[r+9],5,568446438),u=D(u,s,c,l,e[r+14],9,-1019803690),l=D(l,u,s,c,e[r+3],14,-187363961),c=D(c,l,u,s,e[r+8],20,1163531501),s=D(s,c,l,u,e[r+13],5,-1444681467),u=D(u,s,c,l,e[r+2],9,-51403784),l=D(l,u,s,c,e[r+7],14,1735328473),s=A(s,c=D(c,l,u,s,e[r+12],20,-1926607734),l,u,e[r+5],4,-378558),u=A(u,s,c,l,e[r+8],11,-2022574463),l=A(l,u,s,c,e[r+11],16,1839030562),c=A(c,l,u,s,e[r+14],23,-35309556),s=A(s,c,l,u,e[r+1],4,-1530992060),u=A(u,s,c,l,e[r+4],11,1272893353),l=A(l,u,s,c,e[r+7],16,-155497632),c=A(c,l,u,s,e[r+10],23,-1094730640),s=A(s,c,l,u,e[r+13],4,681279174),u=A(u,s,c,l,e[r],11,-358537222),l=A(l,u,s,c,e[r+3],16,-722521979),c=A(c,l,u,s,e[r+6],23,76029189),s=A(s,c,l,u,e[r+9],4,-640364487),u=A(u,s,c,l,e[r+12],11,-421815835),l=A(l,u,s,c,e[r+15],16,530742520),s=B(s,c=A(c,l,u,s,e[r+2],23,-995338651),l,u,e[r],6,-198630844),u=B(u,s,c,l,e[r+7],10,1126891415),l=B(l,u,s,c,e[r+14],15,-1416354905),c=B(c,l,u,s,e[r+5],21,-57434055),s=B(s,c,l,u,e[r+12],6,1700485571),u=B(u,s,c,l,e[r+3],10,-1894986606),l=B(l,u,s,c,e[r+10],15,-1051523),c=B(c,l,u,s,e[r+1],21,-2054922799),s=B(s,c,l,u,e[r+8],6,1873313359),u=B(u,s,c,l,e[r+15],10,-30611744),l=B(l,u,s,c,e[r+6],15,-1560198380),c=B(c,l,u,s,e[r+13],21,1309151649),s=B(s,c,l,u,e[r+4],6,-145523070),u=B(u,s,c,l,e[r+11],10,-1120210379),l=B(l,u,s,c,e[r+2],15,718787259),c=B(c,l,u,s,e[r+9],21,-343485551),s=R(s,n),c=R(c,o),l=R(l,i),u=R(u,a);return[s,c,l,u]}function L(e){var t,r="",n=32*e.length;for(t=0;t<n;t+=8)r+=String.fromCharCode(e[t>>5]>>>t%32&255);return r}function H(e){var t,r=[];for(r[(e.length>>2)-1]=void 0,t=0;t<r.length;t+=1)r[t]=0;var n=8*e.length;for(t=0;t<n;t+=8)r[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return r}function I(e){var t,r,n="";for(r=0;r<e.length;r+=1)t=e.charCodeAt(r),n+="0123456789abcdef".charAt(t>>>4&15)+"0123456789abcdef".charAt(15&t);return n}function P(e){return unescape(encodeURIComponent(e))}function U(e){return function(e){return L(M(H(e),8*e.length))}(P(e))}function N(e,t){return function(e,t){var r,n,o=H(e),i=[],a=[];for(i[15]=a[15]=void 0,o.length>16&&(o=M(o,8*e.length)),r=0;r<16;r+=1)i[r]=909522486^o[r],a[r]=1549556828^o[r];return n=M(i.concat(H(t)),512+8*t.length),L(M(a.concat(n),640))}(P(e),P(t))}var q=function(e,t,r){return t?r?N(t,e):I(N(t,e)):r?U(e):I(U(e))};function z(e){this.name="RavenConfigError",this.message=e}z.prototype=new Error,z.prototype.constructor=z;var K=z,W=function(e,t,r){var n=e[t],o=e;if(t in e){var i="warn"===t?"warning":t;e[t]=function(){var e=[].slice.call(arguments),a=E.safeJoin(e," "),s={level:i,logger:"console",extra:{arguments:e}};"assert"===t?!1===e[0]&&(a="Assertion failed: "+(E.safeJoin(e.slice(1)," ")||"console.assert"),s.extra.arguments=e.slice(1),r&&r(a,s)):r&&r(a,s),n&&Function.prototype.apply.call(n,o,e)}}},V=E.isErrorEvent,$=E.isDOMError,X=E.isDOMException,J=E.isError,G=E.isObject,Y=E.isPlainObject,Z=E.isUndefined,Q=E.isFunction,ee=E.isString,te=E.isArray,re=E.isEmptyObject,ne=E.each,oe=E.objectMerge,ie=E.truncate,ae=E.objectFrozen,se=E.hasKey,ce=E.joinRegExp,le=E.urlencode,ue=E.uuid4,he=E.htmlTreeAsString,pe=E.isSameException,fe=E.isSameStacktrace,de=E.parseUrl,ge=E.fill,me=E.supportsFetch,_e=E.supportsReferrerPolicy,ve=E.serializeKeysForMessage,be=E.serializeException,ye=E.sanitize,Ee=W,we="source protocol user pass host port path".split(" "),xe=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;function ke(){return+new Date}var Se="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},Oe=Se.document,Ce=Se.navigator;function je(e,t){return Q(t)?function(r){return t(r,e)}:t}function Re(){for(var e in this._hasJSON=!("object"!=typeof JSON||!JSON.stringify),this._hasDocument=!Z(Oe),this._hasNavigator=!Z(Ce),this._lastCapturedException=null,this._lastData=null,this._lastEventId=null,this._globalServer=null,this._globalKey=null,this._globalProject=null,this._globalContext={},this._globalOptions={release:Se.SENTRY_RELEASE&&Se.SENTRY_RELEASE.id,logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],headers:null,collectWindowErrors:!0,captureUnhandledRejections:!0,maxMessageLength:0,maxUrlLength:250,stackTraceLimit:50,autoBreadcrumbs:!0,instrument:!0,sampleRate:1,sanitizeKeys:[]},this._fetchDefaults={method:"POST",referrerPolicy:_e()?"origin":""},this._ignoreOnError=0,this._isRavenInstalled=!1,this._originalErrorStackTraceLimit=Error.stackTraceLimit,this._originalConsole=Se.console||{},this._originalConsoleMethods={},this._plugins=[],this._startTime=ke(),this._wrappedBuiltIns=[],this._breadcrumbs=[],this._lastCapturedEvent=null,this._keypressTimeout,this._location=Se.location,this._lastHref=this._location&&this._location.href,this._resetBackoff(),this._originalConsole)this._originalConsoleMethods[e]=this._originalConsole[e]}Re.prototype={VERSION:"3.27.0",debug:!1,TraceKit:j,config:function(e,t){var r=this;if(r._globalServer)return this._logDebug("error","Error: Raven has already been configured"),r;if(!e)return r;var n=r._globalOptions;t&&ne(t,function(e,t){"tags"===e||"extra"===e||"user"===e?r._globalContext[e]=t:n[e]=t}),r.setDSN(e),n.ignoreErrors.push(/^Script error\.?$/),n.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),n.ignoreErrors=ce(n.ignoreErrors),n.ignoreUrls=!!n.ignoreUrls.length&&ce(n.ignoreUrls),n.whitelistUrls=!!n.whitelistUrls.length&&ce(n.whitelistUrls),n.includePaths=ce(n.includePaths),n.maxBreadcrumbs=Math.max(0,Math.min(n.maxBreadcrumbs||100,100));var o={xhr:!0,console:!0,dom:!0,location:!0,sentry:!0},i=n.autoBreadcrumbs;"[object Object]"==={}.toString.call(i)?i=oe(o,i):!1!==i&&(i=o),n.autoBreadcrumbs=i;var a={tryCatch:!0},s=n.instrument;return"[object Object]"==={}.toString.call(s)?s=oe(a,s):!1!==s&&(s=a),n.instrument=s,j.collectWindowErrors=!!n.collectWindowErrors,r},install:function(){var e=this;return e.isSetup()&&!e._isRavenInstalled&&(j.report.subscribe(function(){e._handleOnErrorStackInfo.apply(e,arguments)}),e._globalOptions.captureUnhandledRejections&&e._attachPromiseRejectionHandler(),e._patchFunctionToString(),e._globalOptions.instrument&&e._globalOptions.instrument.tryCatch&&e._instrumentTryCatch(),e._globalOptions.autoBreadcrumbs&&e._instrumentBreadcrumbs(),e._drainPlugins(),e._isRavenInstalled=!0),Error.stackTraceLimit=e._globalOptions.stackTraceLimit,this},setDSN:function(e){var t=this._parseDSN(e),r=t.path.lastIndexOf("/"),n=t.path.substr(1,r);this._dsn=e,this._globalKey=t.user,this._globalSecret=t.pass&&t.pass.substr(1),this._globalProject=t.path.substr(r+1),this._globalServer=this._getGlobalServer(t),this._globalEndpoint=this._globalServer+"/"+n+"api/"+this._globalProject+"/store/",this._resetBackoff()},context:function(e,t,r){return Q(e)&&(r=t||[],t=e,e={}),this.wrap(e,t).apply(this,r)},wrap:function(e,t,r){var n=this;if(Z(t)&&!Q(e))return e;if(Q(e)&&(t=e,e=void 0),!Q(t))return t;try{if(t.__raven__)return t;if(t.__raven_wrapper__)return t.__raven_wrapper__}catch(e){return t}function o(){var o=[],i=arguments.length,a=!e||e&&!1!==e.deep;for(r&&Q(r)&&r.apply(this,arguments);i--;)o[i]=a?n.wrap(e,arguments[i]):arguments[i];try{return t.apply(this,o)}catch(t){throw n._ignoreNextOnError(),n.captureException(t,e),t}}for(var i in t)se(t,i)&&(o[i]=t[i]);return o.prototype=t.prototype,t.__raven_wrapper__=o,o.__raven__=!0,o.__orig__=t,o},uninstall:function(){return j.report.uninstall(),this._detachPromiseRejectionHandler(),this._unpatchFunctionToString(),this._restoreBuiltIns(),this._restoreConsole(),Error.stackTraceLimit=this._originalErrorStackTraceLimit,this._isRavenInstalled=!1,this},_promiseRejectionHandler:function(e){this._logDebug("debug","Raven caught unhandled promise rejection:",e),this.captureException(e.reason,{mechanism:{type:"onunhandledrejection",handled:!1}})},_attachPromiseRejectionHandler:function(){return this._promiseRejectionHandler=this._promiseRejectionHandler.bind(this),Se.addEventListener&&Se.addEventListener("unhandledrejection",this._promiseRejectionHandler),this},_detachPromiseRejectionHandler:function(){return Se.removeEventListener&&Se.removeEventListener("unhandledrejection",this._promiseRejectionHandler),this},captureException:function(e,t){if(t=oe({trimHeadFrames:0},t||{}),V(e)&&e.error)e=e.error;else{if($(e)||X(e)){var r=e.name||($(e)?"DOMError":"DOMException"),n=e.message?r+": "+e.message:r;return this.captureMessage(n,oe(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}))}if(J(e))e=e;else{if(!Y(e))return this.captureMessage(e,oe(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}));t=this._getCaptureExceptionOptionsFromPlainObject(t,e),e=new Error(t.message)}}this._lastCapturedException=e;try{var o=j.computeStackTrace(e);this._handleStackInfo(o,t)}catch(t){if(e!==t)throw t}return this},_getCaptureExceptionOptionsFromPlainObject:function(e,t){var r=Object.keys(t).sort(),n=oe(e,{message:"Non-Error exception captured with keys: "+ve(r),fingerprint:[q(r)],extra:e.extra||{}});return n.extra.__serialized__=be(t),n},captureMessage:function(e,t){if(!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(e)){var r,n=oe({message:e+=""},t=t||{});try{throw new Error(e)}catch(e){r=e}r.name=null;var o=j.computeStackTrace(r),i=te(o.stack)&&o.stack[1];i&&"Raven.captureException"===i.func&&(i=o.stack[2]);var a=i&&i.url||"";if((!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(a))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(a))){if(this._globalOptions.stacktrace||t.stacktrace||""===n.message){n.fingerprint=null==n.fingerprint?e:n.fingerprint,(t=oe({trimHeadFrames:0},t)).trimHeadFrames+=1;var s=this._prepareFrames(o,t);n.stacktrace={frames:s.reverse()}}return n.fingerprint&&(n.fingerprint=te(n.fingerprint)?n.fingerprint:[n.fingerprint]),this._send(n),this}}},captureBreadcrumb:function(e){var t=oe({timestamp:ke()/1e3},e);if(Q(this._globalOptions.breadcrumbCallback)){var r=this._globalOptions.breadcrumbCallback(t);if(G(r)&&!re(r))t=r;else if(!1===r)return this}return this._breadcrumbs.push(t),this._breadcrumbs.length>this._globalOptions.maxBreadcrumbs&&this._breadcrumbs.shift(),this},addPlugin:function(e){var t=[].slice.call(arguments,1);return this._plugins.push([e,t]),this._isRavenInstalled&&this._drainPlugins(),this},setUserContext:function(e){return this._globalContext.user=e,this},setExtraContext:function(e){return this._mergeContext("extra",e),this},setTagsContext:function(e){return this._mergeContext("tags",e),this},clearContext:function(){return this._globalContext={},this},getContext:function(){return JSON.parse(r(this._globalContext))},setEnvironment:function(e){return this._globalOptions.environment=e,this},setRelease:function(e){return this._globalOptions.release=e,this},setDataCallback:function(e){var t=this._globalOptions.dataCallback;return this._globalOptions.dataCallback=je(t,e),this},setBreadcrumbCallback:function(e){var t=this._globalOptions.breadcrumbCallback;return this._globalOptions.breadcrumbCallback=je(t,e),this},setShouldSendCallback:function(e){var t=this._globalOptions.shouldSendCallback;return this._globalOptions.shouldSendCallback=je(t,e),this},setTransport:function(e){return this._globalOptions.transport=e,this},lastException:function(){return this._lastCapturedException},lastEventId:function(){return this._lastEventId},isSetup:function(){return!!this._hasJSON&&(!!this._globalServer||(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this._logDebug("error","Error: Raven has not been configured.")),!1))},afterLoad:function(){var e=Se.RavenConfig;e&&this.config(e.dsn,e.config).install()},showReportDialog:function(e){if(Oe){if(!(e=oe({eventId:this.lastEventId(),dsn:this._dsn,user:this._globalContext.user||{}},e)).eventId)throw new K("Missing eventId");if(!e.dsn)throw new K("Missing DSN");var t=encodeURIComponent,r=[];for(var n in e)if("user"===n){var o=e.user;o.name&&r.push("name="+t(o.name)),o.email&&r.push("email="+t(o.email))}else r.push(t(n)+"="+t(e[n]));var i=this._getGlobalServer(this._parseDSN(e.dsn)),a=Oe.createElement("script");a.async=!0,a.src=i+"/api/embed/error-page/?"+r.join("&"),(Oe.head||Oe.body).appendChild(a)}},_ignoreNextOnError:function(){var e=this;this._ignoreOnError+=1,setTimeout(function(){e._ignoreOnError-=1})},_triggerEvent:function(e,t){var r,n;if(this._hasDocument){for(n in t=t||{},e="raven"+e.substr(0,1).toUpperCase()+e.substr(1),Oe.createEvent?(r=Oe.createEvent("HTMLEvents")).initEvent(e,!0,!0):(r=Oe.createEventObject()).eventType=e,t)se(t,n)&&(r[n]=t[n]);if(Oe.createEvent)Oe.dispatchEvent(r);else try{Oe.fireEvent("on"+r.eventType.toLowerCase(),r)}catch(e){}}},_breadcrumbEventHandler:function(e){var t=this;return function(r){if(t._keypressTimeout=null,t._lastCapturedEvent!==r){var n;t._lastCapturedEvent=r;try{n=he(r.target)}catch(e){n="<unknown>"}t.captureBreadcrumb({category:"ui."+e,message:n})}}},_keypressEventHandler:function(){var e=this;return function(t){var r;try{r=t.target}catch(e){return}var n=r&&r.tagName;if(n&&("INPUT"===n||"TEXTAREA"===n||r.isContentEditable)){var o=e._keypressTimeout;o||e._breadcrumbEventHandler("input")(t),clearTimeout(o),e._keypressTimeout=setTimeout(function(){e._keypressTimeout=null},1e3)}}},_captureUrlChange:function(e,t){var r=de(this._location.href),n=de(t),o=de(e);this._lastHref=t,r.protocol===n.protocol&&r.host===n.host&&(t=n.relative),r.protocol===o.protocol&&r.host===o.host&&(e=o.relative),this.captureBreadcrumb({category:"navigation",data:{to:t,from:e}})},_patchFunctionToString:function(){var e=this;e._originalFunctionToString=Function.prototype.toString,Function.prototype.toString=function(){return"function"==typeof this&&this.__raven__?e._originalFunctionToString.apply(this.__orig__,arguments):e._originalFunctionToString.apply(this,arguments)}},_unpatchFunctionToString:function(){this._originalFunctionToString&&(Function.prototype.toString=this._originalFunctionToString)},_instrumentTryCatch:function(){var e=this,t=e._wrappedBuiltIns;function r(t){return function(r,n){for(var o=new Array(arguments.length),i=0;i<o.length;++i)o[i]=arguments[i];var a=o[0];return Q(a)&&(o[0]=e.wrap({mechanism:{type:"instrument",data:{function:t.name||"<anonymous>"}}},a)),t.apply?t.apply(this,o):t(o[0],o[1])}}var n=this._globalOptions.autoBreadcrumbs;function o(r){var o=Se[r]&&Se[r].prototype;o&&o.hasOwnProperty&&o.hasOwnProperty("addEventListener")&&(ge(o,"addEventListener",function(t){return function(o,i,a,s){try{i&&i.handleEvent&&(i.handleEvent=e.wrap({mechanism:{type:"instrument",data:{target:r,function:"handleEvent",handler:i&&i.name||"<anonymous>"}}},i.handleEvent))}catch(e){}var c,l,u;return n&&n.dom&&("EventTarget"===r||"Node"===r)&&(l=e._breadcrumbEventHandler("click"),u=e._keypressEventHandler(),c=function(e){if(e){var t;try{t=e.type}catch(e){return}return"click"===t?l(e):"keypress"===t?u(e):void 0}}),t.call(this,o,e.wrap({mechanism:{type:"instrument",data:{target:r,function:"addEventListener",handler:i&&i.name||"<anonymous>"}}},i,c),a,s)}},t),ge(o,"removeEventListener",function(e){return function(t,r,n,o){try{r=r&&(r.__raven_wrapper__?r.__raven_wrapper__:r)}catch(e){}return e.call(this,t,r,n,o)}},t))}ge(Se,"setTimeout",r,t),ge(Se,"setInterval",r,t),Se.requestAnimationFrame&&ge(Se,"requestAnimationFrame",function(t){return function(r){return t(e.wrap({mechanism:{type:"instrument",data:{function:"requestAnimationFrame",handler:t&&t.name||"<anonymous>"}}},r))}},t);for(var i=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],a=0;a<i.length;a++)o(i[a])},_instrumentBreadcrumbs:function(){var e=this,t=this._globalOptions.autoBreadcrumbs,r=e._wrappedBuiltIns;function n(t,r){t in r&&Q(r[t])&&ge(r,t,function(r){return e.wrap({mechanism:{type:"instrument",data:{function:t,handler:r&&r.name||"<anonymous>"}}},r)})}if(t.xhr&&"XMLHttpRequest"in Se){var o=Se.XMLHttpRequest&&Se.XMLHttpRequest.prototype;ge(o,"open",function(t){return function(r,n){return ee(n)&&-1===n.indexOf(e._globalKey)&&(this.__raven_xhr={method:r,url:n,status_code:null}),t.apply(this,arguments)}},r),ge(o,"send",function(t){return function(){var r=this;function o(){if(r.__raven_xhr&&4===r.readyState){try{r.__raven_xhr.status_code=r.status}catch(e){}e.captureBreadcrumb({type:"http",category:"xhr",data:r.__raven_xhr})}}for(var i=["onload","onerror","onprogress"],a=0;a<i.length;a++)n(i[a],r);return"onreadystatechange"in r&&Q(r.onreadystatechange)?ge(r,"onreadystatechange",function(t){return e.wrap({mechanism:{type:"instrument",data:{function:"onreadystatechange",handler:t&&t.name||"<anonymous>"}}},t,o)}):r.onreadystatechange=o,t.apply(this,arguments)}},r)}t.xhr&&me()&&ge(Se,"fetch",function(t){return function(){for(var r=new Array(arguments.length),n=0;n<r.length;++n)r[n]=arguments[n];var o,i=r[0],a="GET";if("string"==typeof i?o=i:"Request"in Se&&i instanceof Se.Request?(o=i.url,i.method&&(a=i.method)):o=""+i,-1!==o.indexOf(e._globalKey))return t.apply(this,r);r[1]&&r[1].method&&(a=r[1].method);var s={method:a,url:o,status_code:null};return t.apply(this,r).then(function(t){return s.status_code=t.status,e.captureBreadcrumb({type:"http",category:"fetch",data:s}),t}).catch(function(t){throw e.captureBreadcrumb({type:"http",category:"fetch",data:s,level:"error"}),t})}},r),t.dom&&this._hasDocument&&(Oe.addEventListener?(Oe.addEventListener("click",e._breadcrumbEventHandler("click"),!1),Oe.addEventListener("keypress",e._keypressEventHandler(),!1)):Oe.attachEvent&&(Oe.attachEvent("onclick",e._breadcrumbEventHandler("click")),Oe.attachEvent("onkeypress",e._keypressEventHandler())));var i=Se.chrome,a=!(i&&i.app&&i.app.runtime)&&Se.history&&Se.history.pushState&&Se.history.replaceState;if(t.location&&a){var s=Se.onpopstate;Se.onpopstate=function(){var t=e._location.href;if(e._captureUrlChange(e._lastHref,t),s)return s.apply(this,arguments)};var c=function(t){return function(){var r=arguments.length>2?arguments[2]:void 0;return r&&e._captureUrlChange(e._lastHref,r+""),t.apply(this,arguments)}};ge(Se.history,"pushState",c,r),ge(Se.history,"replaceState",c,r)}if(t.console&&"console"in Se&&console.log){var l=function(t,r){e.captureBreadcrumb({message:t,level:r.level,category:"console"})};ne(["debug","info","warn","error","log"],function(e,t){Ee(console,t,l)})}},_restoreBuiltIns:function(){for(var e;this._wrappedBuiltIns.length;){var t=(e=this._wrappedBuiltIns.shift())[0],r=e[1],n=e[2];t[r]=n}},_restoreConsole:function(){for(var e in this._originalConsoleMethods)this._originalConsole[e]=this._originalConsoleMethods[e]},_drainPlugins:function(){var e=this;ne(this._plugins,function(t,r){var n=r[0],o=r[1];n.apply(e,[e].concat(o))})},_parseDSN:function(e){var t=xe.exec(e),r={},n=7;try{for(;n--;)r[we[n]]=t[n]||""}catch(t){throw new K("Invalid DSN: "+e)}if(r.pass&&!this._globalOptions.allowSecretKey)throw new K("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");return r},_getGlobalServer:function(e){var t="//"+e.host+(e.port?":"+e.port:"");return e.protocol&&(t=e.protocol+":"+t),t},_handleOnErrorStackInfo:function(e,t){(t=t||{}).mechanism=t.mechanism||{type:"onerror",handled:!1},this._ignoreOnError||this._handleStackInfo(e,t)},_handleStackInfo:function(e,t){var r=this._prepareFrames(e,t);this._triggerEvent("handle",{stackInfo:e,options:t}),this._processException(e.name,e.message,e.url,e.lineno,r,t)},_prepareFrames:function(e,t){var r=this,n=[];if(e.stack&&e.stack.length&&(ne(e.stack,function(t,o){var i=r._normalizeFrame(o,e.url);i&&n.push(i)}),t&&t.trimHeadFrames))for(var o=0;o<t.trimHeadFrames&&o<n.length;o++)n[o].in_app=!1;return n=n.slice(0,this._globalOptions.stackTraceLimit)},_normalizeFrame:function(e,t){var r={filename:e.url,lineno:e.line,colno:e.column,function:e.func||"?"};return e.url||(r.filename=t),r.in_app=!(this._globalOptions.includePaths.test&&!this._globalOptions.includePaths.test(r.filename)||/(Raven|TraceKit)\./.test(r.function)||/raven\.(min\.)?js$/.test(r.filename)),r},_processException:function(e,t,r,n,o,i){var a,s=(e?e+": ":"")+(t||"");if((!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(t)&&!this._globalOptions.ignoreErrors.test(s))&&(o&&o.length?(r=o[0].filename||r,o.reverse(),a={frames:o}):r&&(a={frames:[{filename:r,lineno:n,in_app:!0}]}),(!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(r))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(r)))){var c=oe({exception:{values:[{type:e,value:t,stacktrace:a}]},transaction:r},i),l=c.exception.values[0];null==l.type&&""===l.value&&(l.value="Unrecoverable error caught"),!c.exception.mechanism&&c.mechanism&&(c.exception.mechanism=c.mechanism,delete c.mechanism),c.exception.mechanism=oe({type:"generic",handled:!0},c.exception.mechanism||{}),this._send(c)}},_trimPacket:function(e){var t=this._globalOptions.maxMessageLength;if(e.message&&(e.message=ie(e.message,t)),e.exception){var r=e.exception.values[0];r.value=ie(r.value,t)}var n=e.request;return n&&(n.url&&(n.url=ie(n.url,this._globalOptions.maxUrlLength)),n.Referer&&(n.Referer=ie(n.Referer,this._globalOptions.maxUrlLength))),e.breadcrumbs&&e.breadcrumbs.values&&this._trimBreadcrumbs(e.breadcrumbs),e},_trimBreadcrumbs:function(e){for(var t,r,n,o=["to","from","url"],i=0;i<e.values.length;++i)if((r=e.values[i]).hasOwnProperty("data")&&G(r.data)&&!ae(r.data)){n=oe({},r.data);for(var a=0;a<o.length;++a)t=o[a],n.hasOwnProperty(t)&&n[t]&&(n[t]=ie(n[t],this._globalOptions.maxUrlLength));e.values[i].data=n}},_getHttpData:function(){if(this._hasNavigator||this._hasDocument){var e={};return this._hasNavigator&&Ce.userAgent&&(e.headers={"User-Agent":Ce.userAgent}),Se.location&&Se.location.href&&(e.url=Se.location.href),this._hasDocument&&Oe.referrer&&(e.headers||(e.headers={}),e.headers.Referer=Oe.referrer),e}},_resetBackoff:function(){this._backoffDuration=0,this._backoffStart=null},_shouldBackoff:function(){return this._backoffDuration&&ke()-this._backoffStart<this._backoffDuration},_isRepeatData:function(e){var t=this._lastData;return!(!t||e.message!==t.message||e.transaction!==t.transaction)&&(e.stacktrace||t.stacktrace?fe(e.stacktrace,t.stacktrace):!e.exception&&!t.exception||pe(e.exception,t.exception))},_setBackoffState:function(e){if(!this._shouldBackoff()){var t=e.status;if(400===t||401===t||429===t){var r;try{r=me()?e.headers.get("Retry-After"):e.getResponseHeader("Retry-After"),r=1e3*parseInt(r,10)}catch(e){}this._backoffDuration=r||(2*this._backoffDuration||1e3),this._backoffStart=ke()}}},_send:function(e){var t=this._globalOptions,r={project:this._globalProject,logger:t.logger,platform:"javascript"},n=this._getHttpData();n&&(r.request=n),e.trimHeadFrames&&delete e.trimHeadFrames,(e=oe(r,e)).tags=oe(oe({},this._globalContext.tags),e.tags),e.extra=oe(oe({},this._globalContext.extra),e.extra),e.extra["session:duration"]=ke()-this._startTime,this._breadcrumbs&&this._breadcrumbs.length>0&&(e.breadcrumbs={values:[].slice.call(this._breadcrumbs,0)}),this._globalContext.user&&(e.user=this._globalContext.user),t.environment&&(e.environment=t.environment),t.release&&(e.release=t.release),t.serverName&&(e.server_name=t.serverName),e=this._sanitizeData(e),Object.keys(e).forEach(function(t){(null==e[t]||""===e[t]||re(e[t]))&&delete e[t]}),Q(t.dataCallback)&&(e=t.dataCallback(e)||e),e&&!re(e)&&(Q(t.shouldSendCallback)&&!t.shouldSendCallback(e)||(this._shouldBackoff()?this._logDebug("warn","Raven dropped error due to backoff: ",e):"number"==typeof t.sampleRate?Math.random()<t.sampleRate&&this._sendProcessedPayload(e):this._sendProcessedPayload(e)))},_sanitizeData:function(e){return ye(e,this._globalOptions.sanitizeKeys)},_getUuid:function(){return ue()},_sendProcessedPayload:function(e,t){var r=this,n=this._globalOptions;if(this.isSetup())if(e=this._trimPacket(e),this._globalOptions.allowDuplicates||!this._isRepeatData(e)){this._lastEventId=e.event_id||(e.event_id=this._getUuid()),this._lastData=e,this._logDebug("debug","Raven about to send:",e);var o={sentry_version:"7",sentry_client:"raven-js/"+this.VERSION,sentry_key:this._globalKey};this._globalSecret&&(o.sentry_secret=this._globalSecret);var i=e.exception&&e.exception.values[0];this._globalOptions.autoBreadcrumbs&&this._globalOptions.autoBreadcrumbs.sentry&&this.captureBreadcrumb({category:"sentry",message:i?(i.type?i.type+": ":"")+i.value:e.message,event_id:e.event_id,level:e.level||"error"});var a=this._globalEndpoint;(n.transport||this._makeRequest).call(this,{url:a,auth:o,data:e,options:n,onSuccess:function(){r._resetBackoff(),r._triggerEvent("success",{data:e,src:a}),t&&t()},onError:function(n){r._logDebug("error","Raven transport failed to send: ",n),n.request&&r._setBackoffState(n.request),r._triggerEvent("failure",{data:e,src:a}),n=n||new Error("Raven send failed (no additional details provided)"),t&&t(n)}})}else this._logDebug("warn","Raven dropped repeat event: ",e)},_makeRequest:function(e){var t=e.url+"?"+le(e.auth),n=null,o={};if(e.options.headers&&(n=this._evaluateHash(e.options.headers)),e.options.fetchParameters&&(o=this._evaluateHash(e.options.fetchParameters)),me()){o.body=r(e.data);var i=oe({},this._fetchDefaults),a=oe(i,o);return n&&(a.headers=n),Se.fetch(t,a).then(function(t){if(t.ok)e.onSuccess&&e.onSuccess();else{var r=new Error("Sentry error code: "+t.status);r.request=t,e.onError&&e.onError(r)}}).catch(function(){e.onError&&e.onError(new Error("Sentry error code: network unavailable"))})}var s=Se.XMLHttpRequest&&new Se.XMLHttpRequest;s&&(("withCredentials"in s||"undefined"!=typeof XDomainRequest)&&("withCredentials"in s?s.onreadystatechange=function(){if(4===s.readyState)if(200===s.status)e.onSuccess&&e.onSuccess();else if(e.onError){var t=new Error("Sentry error code: "+s.status);t.request=s,e.onError(t)}}:(s=new XDomainRequest,t=t.replace(/^https?:/,""),e.onSuccess&&(s.onload=e.onSuccess),e.onError&&(s.onerror=function(){var t=new Error("Sentry error code: XDomainRequest");t.request=s,e.onError(t)})),s.open("POST",t),n&&ne(n,function(e,t){s.setRequestHeader(e,t)}),s.send(r(e.data))))},_evaluateHash:function(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];t[r]="function"==typeof n?n():n}return t},_logDebug:function(e){this._originalConsoleMethods[e]&&(this.debug||this._globalOptions.debug)&&Function.prototype.apply.call(this._originalConsoleMethods[e],this._originalConsole,[].slice.call(arguments,1))},_mergeContext:function(e,t){Z(t)?delete this._globalContext[e]:this._globalContext[e]=oe(this._globalContext[e]||{},t)}},Re.prototype.setUser=Re.prototype.setUserContext,Re.prototype.setReleaseContext=Re.prototype.setRelease;var Te=Re,Fe="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},De=Fe.Raven,Ae=new Te;Ae.noConflict=function(){return Fe.Raven=De,Ae},Ae.afterLoad();var Be,Me,Le,He,Ie,Pe,Ue,Ne,qe=Ae,ze=Te;qe.Client=ze,Ue=window.location.host,Ne={prod:"plyr.io"===Ue,dev:"dev.plyr.io"===Ue},document.addEventListener("DOMContentLoaded",function(){qe.context(function(){var e=document.getElementById("container");window.shr&&window.shr.setup({count:{classname:"button__count"}}),document.addEventListener("focusout",function(t){t.target.classList&&!e.contains(t.target)&&t.target.classList.remove("tab-focus")}),document.addEventListener("keydown",function(t){9===t.keyCode&&setTimeout(function(){var t=document.activeElement;t&&t.classList&&!e.contains(t)&&t.classList.add("tab-focus")},10)});var t=new Plyr("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"../dist/plyr.svg",keyboard:{global:!0},tooltips:{controls:!0},captions:{active:!0},keys:{google:"AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c"},ads:{enabled:Ne.prod||Ne.dev,publisherId:"918848828995742"}});window.player=t;var r=document.querySelectorAll("[data-source]"),n={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},o=window.location.hash.replace("#",""),i=window.history&&window.history.pushState;function a(e,t,r){e&&e.classList[r?"add":"remove"](t)}function s(e,i){if(e in n&&(i||e!==o)&&(o.length||e!==n.video)){switch(e){case n.video:t.source={type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4",type:"video/mp4",size:576},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4",type:"video/mp4",size:720},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4",type:"video/mp4",size:1080},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4",type:"video/mp4",size:1440}],poster:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt",default:!0},{kind:"captions",label:"French",srclang:"fr",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt"}]};break;case n.audio:t.source={type:"audio",title:"Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;",sources:[{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]};break;case n.youtube:t.source={type:"video",sources:[{src:"https://youtube.com/watch?v=bTqVqk7FSmY",provider:"youtube"}]};break;case n.vimeo:t.source={type:"video",sources:[{src:"https://vimeo.com/76979871",provider:"vimeo"}]}}o=e,Array.from(r).forEach(function(e){return a(e.parentElement,"active",!1)}),a(document.querySelector('[data-source="'.concat(e,'"]')),"active",!0),Array.from(document.querySelectorAll(".plyr__cite")).forEach(function(e){e.setAttribute("hidden","")}),document.querySelector(".plyr__cite--".concat(e)).removeAttribute("hidden")}}if(Array.from(r).forEach(function(e){e.addEventListener("click",function(){var t=e.getAttribute("data-source");s(t),i&&window.history.pushState({type:t},"","#".concat(t))})}),window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&s(e.state.type)}),i){var c=!o.length;c&&(o=n.video),o in n&&window.history.replaceState({type:o},"",c?"":"#".concat(o)),o!==n.video&&s(o,!0)}})}),Ne.prod&&qe.config("https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555").install(),Ne.prod&&(Be=window,Me=document,Le="script",He="ga",Be.GoogleAnalyticsObject=He,Be.ga=Be.ga||function(){(Be.ga.q=Be.ga.q||[]).push(arguments)},Be.ga.l=1*new Date,Ie=Me.createElement(Le),Pe=Me.getElementsByTagName(Le)[0],Ie.async=1,Ie.src="https://www.google-analytics.com/analytics.js",Pe.parentNode.insertBefore(Ie,Pe),window.ga("create","UA-40881672-11","auto"),window.ga("send","pageview"))}();
//# sourceMappingURL=demo.min.js.map
diff --git a/demo/dist/demo.min.js.map b/demo/dist/demo.min.js.map
index 186154bb..59365114 100644
--- a/demo/dist/demo.min.js.map
+++ b/demo/dist/demo.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["node_modules/raven-js/vendor/json-stringify-safe/stringify.js","node_modules/raven-js/src/utils.js","node_modules/raven-js/vendor/TraceKit/tracekit.js","node_modules/raven-js/vendor/md5/md5.js","node_modules/raven-js/src/configError.js","node_modules/raven-js/src/console.js","node_modules/raven-js/src/raven.js","node_modules/raven-js/src/singleton.js","demo/src/js/demo.js"],"names":["indexOf","haystack","needle","i","length","serializer","replacer","cycleReplacer","stack","keys","key","value","slice","join","thisPos","this","splice","push","Infinity","call","Error","err","message","name","Object","prototype","hasOwnProperty","stringifyError","module","exports","obj","spaces","JSON","stringify","getSerialize","_window","window","global","self","isUndefined","what","isPlainObject","toString","isString","isArray","supportsFetch","Headers","Request","Response","e","each","callback","j","hasKey","truncate","str","max","substr","object","joinRegExp","patterns","pattern","sources","len","replace","source","RegExp","htmlElementAsString","elem","className","classes","attr","out","tagName","toLowerCase","id","split","attrWhitelist","getAttribute","isOnlyOneTruthy","a","b","isSameStacktrace","stack1","stack2","frames1","frames","frames2","undefined","filename","lineno","colno","MAX_SERIALIZE_EXCEPTION_DEPTH","MAX_SERIALIZE_EXCEPTION_SIZE","MAX_SERIALIZE_KEYS_LENGTH","jsonSize","encodeURI","utf8Length","serializeValue","type","utils","isObject","isError","isErrorEvent","isDOMError","isDOMException","isFunction","isEmptyObject","_","supportsErrorEvent","ErrorEvent","supportsDOMError","DOMError","supportsDOMException","DOMException","supportsReferrerPolicy","referrerPolicy","supportsPromiseRejectionEvent","PromiseRejectionEvent","wrappedCallback","data","original","normalizedData","objectMerge","obj1","obj2","objectFrozen","isFrozen","urlencode","o","pairs","encodeURIComponent","uuid4","crypto","msCrypto","getRandomValues","arr","Uint16Array","pad","num","v","c","r","Math","random","htmlTreeAsString","nextStr","height","sepLength","parentNode","reverse","isSameException","ex1","ex2","values","stacktrace","parseUrl","url","match","query","fragment","protocol","host","path","relative","fill","replacement","track","orig","__raven__","__orig__","safeJoin","input","delimiter","output","String","serializeException","ex","depth","maxSize","serialized","serializeObject","reduce","acc","Array","map","val","serializeKeysForMessage","maxLength","filter","usedKeys","sanitize","sanitizeKeys","safeInput","sanitizeRegExp","sanitizeMask","parse","o_O","sanitizeWorker","workerInput","k","test","TraceKit","collectWindowErrors","debug","_slice","UNKNOWN_FUNCTION","ERROR_TYPES_RE","getLocationHref","document","location","href","report","_oldOnerrorHandler","_onErrorHandlerInstalled","handlers","lastArgs","lastException","lastExceptionStack","notifyHandlers","isWindowError","exception","apply","concat","arguments","inner","traceKitWindowOnError","msg","lineNo","colNo","error","computeStackTrace","augmentStackTraceWithInitialElement","processLastException","groups","line","column","func","_lastExceptionStack","_lastArgs","rethrow","args","setTimeout","incomplete","subscribe","handler","onerror","unsubscribe","uninstall","computeStackTraceFromStackProp","submatch","parts","element","chrome","winjs","gecko","geckoEval","chromeEval","lines","exec","isNative","columnNumber","xhr","XMLHttpRequest","open","send","status","responseText","sourceMaps","sourceMapAddress","charAt","origin","hostname","port","stackInfo","initial","unshift","partial","computeStackTraceByWalkingCallerChain","item","functionName","funcs","recursion","curr","caller","substring","result","sourceURL","fileName","lineNumber","description","tracekit","safeAdd","x","y","lsw","md5cmn","q","s","t","cnt","md5ff","d","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","length32","fromCharCode","rstr2binl","length8","charCodeAt","rstr2hex","str2rstrUTF8","unescape","rawMD5","rstrMD5","rawHMACMD5","hash","bkey","ipad","opad","rstrHMACMD5","md5_1","string","raw","RavenConfigError","constructor","configError","console$1","console","level","originalConsoleLevel","originalConsole","sentryLevel","logger","extra","Function","wrapConsoleMethod","require$$0","dsnKeys","dsnPattern","now","Date","_document","_navigator","navigator","keepOriginalCallback","Raven","method","_hasJSON","_hasDocument","_hasNavigator","_lastCapturedException","_lastData","_lastEventId","_globalServer","_globalKey","_globalProject","_globalContext","_globalOptions","release","SENTRY_RELEASE","ignoreErrors","ignoreUrls","whitelistUrls","includePaths","headers","captureUnhandledRejections","maxMessageLength","maxUrlLength","stackTraceLimit","autoBreadcrumbs","instrument","sampleRate","_fetchDefaults","keepalive","_ignoreOnError","_isRavenInstalled","_originalErrorStackTraceLimit","_originalConsole","_originalConsoleMethods","_plugins","_startTime","_wrappedBuiltIns","_breadcrumbs","_lastCapturedEvent","_keypressTimeout","_location","_lastHref","_resetBackoff","VERSION","config","dsn","options","_logDebug","globalOptions","setDSN","maxBreadcrumbs","min","autoBreadcrumbDefaults","dom","sentry","instrumentDefaults","tryCatch","install","isSetup","_handleOnErrorStackInfo","_attachPromiseRejectionHandler","_patchFunctionToString","_instrumentTryCatch","_instrumentBreadcrumbs","_drainPlugins","uri","_parseDSN","lastSlash","lastIndexOf","_dsn","user","_globalSecret","pass","_getGlobalServer","_globalEndpoint","context","wrap","_before","__raven_wrapper__","wrapped","deep","_ignoreNextOnError","captureException","property","_detachPromiseRejectionHandler","_unpatchFunctionToString","_restoreBuiltIns","_restoreConsole","_promiseRejectionHandler","event","reason","mechanism","handled","bind","addEventListener","removeEventListener","trimHeadFrames","captureMessage","_getCaptureExceptionOptionsFromPlainObject","_handleStackInfo","currentOptions","exKeys","sort","fingerprint","md5","__serialized__","initialCall","fileurl","_prepareFrames","_send","captureBreadcrumb","crumb","timestamp","breadcrumbCallback","shift","addPlugin","plugin","pluginArgs","setUserContext","setExtraContext","_mergeContext","setTagsContext","tags","clearContext","getContext","setEnvironment","environment","setRelease","setDataCallback","dataCallback","setBreadcrumbCallback","setShouldSendCallback","shouldSendCallback","setTransport","transport","lastEventId","ravenNotConfiguredError","afterLoad","RavenConfig","showReportDialog","assign","eventId","encode","encodedOptions","email","globalServer","script","createElement","async","src","head","body","appendChild","_triggerEvent","eventType","evt","toUpperCase","createEvent","initEvent","createEventObject","dispatchEvent","fireEvent","_breadcrumbEventHandler","evtName","target","category","_keypressEventHandler","isContentEditable","timeout","clearTimeout","_captureUrlChange","from","to","parsedLoc","parsedTo","parsedFrom","_originalFunctionToString","wrappedBuiltIns","wrapTimeFn","fn","originalCallback","function","wrapEventTarget","proto","capture","secure","handleEvent","before","clickHandler","keypressHandler","requestAnimationFrame","cb","eventTargets","wrapProp","prop","xhrproto","origOpen","__raven_xhr","status_code","origSend","onreadystatechangeHandler","readyState","props","onreadystatechange","origFetch","fetchInput","fetchData","then","response","attachEvent","hasPushAndReplaceState","app","runtime","history","pushState","replaceState","oldOnPopState","onpopstate","currentHref","historyReplacementFunction","origHistFunction","log","consoleMethodCallback","builtin","installer","m","allowSecretKey","_processException","frame","_normalizeFrame","in_app","stackInfoUrl","normalized","prefixedMessage","transaction","_trimPacket","request","Referer","breadcrumbs","_trimBreadcrumbs","urlProp","urlProps","_getHttpData","httpData","userAgent","User-Agent","referrer","_backoffDuration","_backoffStart","_shouldBackoff","_isRepeatData","current","last","_setBackoffState","retry","get","getResponseHeader","parseInt","baseData","project","platform","serverName","server_name","_sanitizeData","forEach","_sendProcessedPayload","_getUuid","allowDuplicates","event_id","auth","sentry_version","sentry_client","sentry_key","sentry_secret","_makeRequest","onSuccess","onError","opts","evaluatedHeaders","evaluatedFetchParameters","_evaluateHash","fetchParameters","defaultFetchOptions","fetchOptions","fetch","ok","XDomainRequest","onload","setRequestHeader","evaluated","setUser","setReleaseContext","raven","_Raven","RavenConstructor","noConflict","env","singleton","Client","prod","dev","container","getElementById","shr","setup","count","classname","classList","contains","remove","keyCode","focused","activeElement","add","player","Plyr","title","iconUrl","keyboard","tooltips","controls","captions","active","google","ads","enabled","publisherId","buttons","querySelectorAll","types","video","audio","youtube","vimeo","currentType","historySupport","toggleClass","state","newSource","init","size","poster","tracks","kind","label","srclang","default","provider","button","parentElement","querySelector","cite","setAttribute","removeAttribute","GoogleAnalyticsObject","l","getElementsByTagName","insertBefore","ga"],"mappings":"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","file":"demo.min.js","sourcesContent":["/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : typeof self !== 'undefined'\n ? self\n : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch (Object.prototype.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return Object.prototype.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isDOMError(value) {\n return Object.prototype.toString.call(value) === '[object DOMError]';\n}\n\nfunction isDOMException(value) {\n return Object.prototype.toString.call(value) === '[object DOMException]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMError() {\n try {\n new DOMError(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMException() {\n try {\n new DOMException(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n if (typeof max !== 'number') {\n throw new Error('2nd argument to `truncate` function should be a number');\n }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not <a/> href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if stacktrace is malformed\n if (frames1 === undefined || frames2 === undefined) return false;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n if (typeof value === 'string') {\n var maxLength = 40;\n return truncate(value, maxLength);\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isDOMError: isDOMError,\n isDOMException: isDOMException,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsDOMError: supportsDOMError,\n supportsDOMException: supportsDOMException,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n return document.location.href;\n}\n\nfunction getLocationOrigin() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n // Oh dear IE10...\n if (!document.location.origin) {\n return (\n document.location.protocol +\n '//' +\n document.location.hostname +\n (document.location.port ? ':' + document.location.port : '')\n );\n }\n\n return document.location.origin;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.<string, *>} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n if (element.url && element.url.substr(0, 5) === 'blob:') {\n // Special case for handling JavaScript loaded into a blob.\n // We use a synchronous AJAX request here as a blob is already in\n // memory - it's not making a network request. This will generate a warning\n // in the browser console, but there has already been an error so that's not\n // that much of an issue.\n var xhr = new XMLHttpRequest();\n xhr.open('GET', element.url, false);\n xhr.send(null);\n\n // If we failed to download the source, skip this patch\n if (xhr.status === 200) {\n var source = xhr.responseText || '';\n\n // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.\n // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175\n source = source.slice(-300);\n\n // Now we dig out the source map URL\n var sourceMaps = source.match(/\\/\\/# sourceMappingURL=(.*)$/);\n\n // If we don't find a source map comment or we find more than one, continue on to the next element.\n if (sourceMaps) {\n var sourceMapAddress = sourceMaps[1];\n\n // Now we check to see if it's a relative URL.\n // If it is, convert it to an absolute one.\n if (sourceMapAddress.charAt(0) === '~') {\n sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);\n }\n\n // Now we strip the '.map' off of the end of the URL and update the\n // element so that Sentry can match the map to the blob.\n element.url = sourceMapAddress.slice(0, -4);\n }\n }\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.<string, *>} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isErrorEvent = utils.isErrorEvent;\nvar isDOMError = utils.isDOMError;\nvar isDOMException = utils.isDOMException;\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n keepalive: true,\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.26.4',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = {};\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} _before A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason, {\n mechanism: {\n type: 'onunhandledrejection',\n handled: false\n }\n });\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isDOMError(ex) || isDOMException(ex)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var name = ex.name || (isDOMError(ex) ? 'DOMError' : 'DOMException');\n var message = ex.message ? name + ': ' + ex.message : name;\n\n return this.captureMessage(\n message,\n objectMerge(options, {\n // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well\n // but it's barely any overhead so we may at least try\n stacktrace: true,\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a DOMError/DOMException\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n\n // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n // initialCall => captureException(string) => captureMessage(string)\n if (initialCall && initialCall.func === 'Raven.captureException') {\n initialCall = stack.stack[2];\n }\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n // Always attempt to get stacktrace if message is empty.\n // It's the only way to provide any helpful information to the user.\n if (this._globalOptions.stacktrace || options.stacktrace || data.message === '') {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = Object.assign(\n {\n eventId: this.lastEventId(),\n dsn: this._dsn,\n user: this._globalContext.user || {}\n },\n options\n );\n\n if (!options.eventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n if (!options.dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var encodedOptions = [];\n\n for (var key in options) {\n if (key === 'user') {\n var user = options.user;\n if (user.name) encodedOptions.push('name=' + encode(user.name));\n if (user.email) encodedOptions.push('email=' + encode(user.email));\n } else {\n encodedOptions.push(encode(key) + '=' + encode(options[key]));\n }\n }\n var globalServer = this._getGlobalServer(this._parseDSN(options.dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/?' + encodedOptions.join('&');\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '<unknown>';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: orig.name || '<anonymous>'}\n }\n },\n originalCallback\n );\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'handleEvent',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn.handleEvent\n );\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'addEventListener',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn,\n before\n ),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'requestAnimationFrame',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n cb\n )\n );\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}\n }\n },\n orig\n );\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'onreadystatechange',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n orig,\n onreadystatechangeHandler\n );\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch\n .apply(this, args)\n .then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n })\n ['catch'](function(err) {\n // if there is an error performing the request\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData,\n level: 'error'\n });\n\n throw err;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else if (_document.attachEvent) {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n _window.history.pushState &&\n _window.history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(_window.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(_window.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function(stackInfo, options) {\n options = options || {};\n options.mechanism = options.mechanism || {\n type: 'onerror',\n handled: false\n };\n\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo(stackInfo, options);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n transaction: fileurl\n },\n options\n );\n\n var ex = data.exception.values[0];\n if (ex.type == null && ex.value === '') {\n ex.value = 'Unrecoverable error caught';\n }\n\n // Move mechanism from options to exception interface\n // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be\n // too much\n if (!data.exception.mechanism && data.mechanism) {\n data.exception.mechanism = data.mechanism;\n delete data.mechanism;\n }\n\n data.exception.mechanism = objectMerge(\n {\n type: 'generic',\n handled: true\n },\n data.exception.mechanism || {}\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': _navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.transaction !== last.transaction // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n if (\n this._originalConsoleMethods[level] &&\n (this.debug || this._globalOptions.debug)\n ) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const { host } = window.location;\n const env = {\n prod: host === 'plyr.io',\n dev: host === 'dev.plyr.io',\n };\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n const selector = '#player';\n const container = document.getElementById('container');\n\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n if (!event.target.classList || container.contains(event.target)) {\n return;\n }\n\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n const focused = document.activeElement;\n\n if (!focused || !focused.classList || container.contains(focused)) {\n return;\n }\n\n focused.classList.add(tabClassName);\n }, 10);\n });\n\n // Setup the player\n const player = new Plyr(selector, {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: env.prod || env.dev,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (\n !(type in types) ||\n (!init && type === currentType) ||\n (!currentType.length && type === types.video)\n ) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [\n {\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n },\n ],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [\n {\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n },\n ],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (env.prod) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (env.prod) {\n ((i, s, o, g, r, a, m) => {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]} \ No newline at end of file
+{"version":3,"sources":["node_modules/raven-js/vendor/json-stringify-safe/stringify.js","node_modules/raven-js/src/utils.js","node_modules/raven-js/vendor/TraceKit/tracekit.js","node_modules/raven-js/vendor/md5/md5.js","node_modules/raven-js/src/configError.js","node_modules/raven-js/src/console.js","node_modules/raven-js/src/raven.js","node_modules/raven-js/src/singleton.js","demo/src/js/demo.js"],"names":["indexOf","haystack","needle","i","length","serializer","replacer","cycleReplacer","stack","keys","key","value","slice","join","thisPos","this","splice","push","Infinity","call","Error","err","message","name","Object","prototype","hasOwnProperty","stringifyError","module","exports","obj","spaces","JSON","stringify","getSerialize","_window","window","global","self","isUndefined","what","isPlainObject","toString","isString","isArray","supportsFetch","Headers","Request","Response","e","each","callback","j","hasKey","truncate","str","max","substr","object","joinRegExp","patterns","pattern","sources","len","replace","source","RegExp","htmlElementAsString","elem","className","classes","attr","out","tagName","toLowerCase","id","split","attrWhitelist","getAttribute","isOnlyOneTruthy","a","b","isSameStacktrace","stack1","stack2","frames1","frames","frames2","undefined","filename","lineno","colno","MAX_SERIALIZE_EXCEPTION_DEPTH","MAX_SERIALIZE_EXCEPTION_SIZE","MAX_SERIALIZE_KEYS_LENGTH","jsonSize","encodeURI","utf8Length","serializeValue","type","utils","isObject","isError","isErrorEvent","isDOMError","isDOMException","isFunction","isEmptyObject","_","supportsErrorEvent","ErrorEvent","supportsDOMError","DOMError","supportsDOMException","DOMException","supportsReferrerPolicy","referrerPolicy","supportsPromiseRejectionEvent","PromiseRejectionEvent","wrappedCallback","data","original","normalizedData","objectMerge","obj1","obj2","objectFrozen","isFrozen","urlencode","o","pairs","encodeURIComponent","uuid4","crypto","msCrypto","getRandomValues","arr","Uint16Array","pad","num","v","c","r","Math","random","htmlTreeAsString","nextStr","height","sepLength","parentNode","reverse","isSameException","ex1","ex2","values","stacktrace","parseUrl","url","match","query","fragment","protocol","host","path","relative","fill","replacement","track","orig","__raven__","__orig__","safeJoin","input","delimiter","output","String","serializeException","ex","depth","maxSize","serialized","serializeObject","reduce","acc","Array","map","val","serializeKeysForMessage","maxLength","filter","usedKeys","sanitize","sanitizeKeys","safeInput","sanitizeRegExp","sanitizeMask","parse","o_O","sanitizeWorker","workerInput","k","test","TraceKit","collectWindowErrors","debug","_slice","UNKNOWN_FUNCTION","ERROR_TYPES_RE","getLocationHref","document","location","href","report","_oldOnerrorHandler","_onErrorHandlerInstalled","handlers","lastArgs","lastException","lastExceptionStack","notifyHandlers","isWindowError","exception","apply","concat","arguments","inner","traceKitWindowOnError","msg","lineNo","colNo","error","computeStackTrace","augmentStackTraceWithInitialElement","processLastException","groups","line","column","func","_lastExceptionStack","_lastArgs","rethrow","args","setTimeout","incomplete","subscribe","handler","onerror","unsubscribe","uninstall","computeStackTraceFromStackProp","submatch","parts","element","chrome","winjs","gecko","geckoEval","chromeEval","lines","exec","isNative","columnNumber","xhr","XMLHttpRequest","open","send","status","responseText","sourceMaps","sourceMapAddress","charAt","origin","hostname","port","stackInfo","initial","unshift","partial","computeStackTraceByWalkingCallerChain","item","functionName","funcs","recursion","curr","caller","substring","result","sourceURL","fileName","lineNumber","description","tracekit","safeAdd","x","y","lsw","md5cmn","q","s","t","cnt","md5ff","d","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","length32","fromCharCode","rstr2binl","length8","charCodeAt","rstr2hex","str2rstrUTF8","unescape","rawMD5","rstrMD5","rawHMACMD5","hash","bkey","ipad","opad","rstrHMACMD5","md5_1","string","raw","RavenConfigError","constructor","configError","console$1","console","level","originalConsoleLevel","originalConsole","sentryLevel","logger","extra","Function","wrapConsoleMethod","require$$0","dsnKeys","dsnPattern","now","Date","_document","_navigator","navigator","keepOriginalCallback","Raven","method","_hasJSON","_hasDocument","_hasNavigator","_lastCapturedException","_lastData","_lastEventId","_globalServer","_globalKey","_globalProject","_globalContext","_globalOptions","release","SENTRY_RELEASE","ignoreErrors","ignoreUrls","whitelistUrls","includePaths","headers","captureUnhandledRejections","maxMessageLength","maxUrlLength","stackTraceLimit","autoBreadcrumbs","instrument","sampleRate","_fetchDefaults","_ignoreOnError","_isRavenInstalled","_originalErrorStackTraceLimit","_originalConsole","_originalConsoleMethods","_plugins","_startTime","_wrappedBuiltIns","_breadcrumbs","_lastCapturedEvent","_keypressTimeout","_location","_lastHref","_resetBackoff","VERSION","config","dsn","options","_logDebug","globalOptions","setDSN","maxBreadcrumbs","min","autoBreadcrumbDefaults","dom","sentry","instrumentDefaults","tryCatch","install","isSetup","_handleOnErrorStackInfo","_attachPromiseRejectionHandler","_patchFunctionToString","_instrumentTryCatch","_instrumentBreadcrumbs","_drainPlugins","uri","_parseDSN","lastSlash","lastIndexOf","_dsn","user","_globalSecret","pass","_getGlobalServer","_globalEndpoint","context","wrap","_before","__raven_wrapper__","wrapped","deep","_ignoreNextOnError","captureException","property","_detachPromiseRejectionHandler","_unpatchFunctionToString","_restoreBuiltIns","_restoreConsole","_promiseRejectionHandler","event","reason","mechanism","handled","bind","addEventListener","removeEventListener","trimHeadFrames","captureMessage","_getCaptureExceptionOptionsFromPlainObject","_handleStackInfo","currentOptions","exKeys","sort","fingerprint","md5","__serialized__","initialCall","fileurl","_prepareFrames","_send","captureBreadcrumb","crumb","timestamp","breadcrumbCallback","shift","addPlugin","plugin","pluginArgs","setUserContext","setExtraContext","_mergeContext","setTagsContext","tags","clearContext","getContext","setEnvironment","environment","setRelease","setDataCallback","dataCallback","setBreadcrumbCallback","setShouldSendCallback","shouldSendCallback","setTransport","transport","lastEventId","ravenNotConfiguredError","afterLoad","RavenConfig","showReportDialog","eventId","encode","encodedOptions","email","globalServer","script","createElement","async","src","head","body","appendChild","_triggerEvent","eventType","evt","toUpperCase","createEvent","initEvent","createEventObject","dispatchEvent","fireEvent","_breadcrumbEventHandler","evtName","target","category","_keypressEventHandler","isContentEditable","timeout","clearTimeout","_captureUrlChange","from","to","parsedLoc","parsedTo","parsedFrom","_originalFunctionToString","wrappedBuiltIns","wrapTimeFn","fn","originalCallback","function","wrapEventTarget","proto","capture","secure","handleEvent","before","clickHandler","keypressHandler","requestAnimationFrame","cb","eventTargets","wrapProp","prop","xhrproto","origOpen","__raven_xhr","status_code","origSend","onreadystatechangeHandler","readyState","props","onreadystatechange","origFetch","fetchInput","fetchData","then","response","attachEvent","hasPushAndReplaceState","app","runtime","history","pushState","replaceState","oldOnPopState","onpopstate","currentHref","historyReplacementFunction","origHistFunction","log","consoleMethodCallback","builtin","installer","m","allowSecretKey","_processException","frame","_normalizeFrame","in_app","stackInfoUrl","normalized","prefixedMessage","transaction","_trimPacket","request","Referer","breadcrumbs","_trimBreadcrumbs","urlProp","urlProps","_getHttpData","httpData","userAgent","User-Agent","referrer","_backoffDuration","_backoffStart","_shouldBackoff","_isRepeatData","current","last","_setBackoffState","retry","get","getResponseHeader","parseInt","baseData","project","platform","serverName","server_name","_sanitizeData","forEach","_sendProcessedPayload","_getUuid","allowDuplicates","event_id","auth","sentry_version","sentry_client","sentry_key","sentry_secret","_makeRequest","onSuccess","onError","opts","evaluatedHeaders","evaluatedFetchParameters","_evaluateHash","fetchParameters","defaultFetchOptions","fetchOptions","fetch","ok","XDomainRequest","onload","setRequestHeader","evaluated","setUser","setReleaseContext","raven","_Raven","RavenConstructor","noConflict","env","singleton","Client","prod","dev","container","getElementById","shr","setup","count","classname","classList","contains","remove","keyCode","focused","activeElement","add","player","Plyr","title","iconUrl","keyboard","tooltips","controls","captions","active","google","ads","enabled","publisherId","buttons","querySelectorAll","types","video","audio","youtube","vimeo","currentType","historySupport","toggleClass","state","newSource","init","size","poster","tracks","kind","label","srclang","default","provider","button","parentElement","querySelector","cite","setAttribute","removeAttribute","GoogleAnalyticsObject","l","getElementsByTagName","insertBefore","ga"],"mappings":"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","file":"demo.min.js","sourcesContent":["/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : typeof self !== 'undefined'\n ? self\n : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch (Object.prototype.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return Object.prototype.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isDOMError(value) {\n return Object.prototype.toString.call(value) === '[object DOMError]';\n}\n\nfunction isDOMException(value) {\n return Object.prototype.toString.call(value) === '[object DOMException]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMError() {\n try {\n new DOMError(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMException() {\n try {\n new DOMException(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n if (typeof max !== 'number') {\n throw new Error('2nd argument to `truncate` function should be a number');\n }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not <a/> href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if stacktrace is malformed\n if (frames1 === undefined || frames2 === undefined) return false;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n if (typeof value === 'string') {\n var maxLength = 40;\n return truncate(value, maxLength);\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isDOMError: isDOMError,\n isDOMException: isDOMException,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsDOMError: supportsDOMError,\n supportsDOMException: supportsDOMException,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n return document.location.href;\n}\n\nfunction getLocationOrigin() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n // Oh dear IE10...\n if (!document.location.origin) {\n return (\n document.location.protocol +\n '//' +\n document.location.hostname +\n (document.location.port ? ':' + document.location.port : '')\n );\n }\n\n return document.location.origin;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.<string, *>} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n if (element.url && element.url.substr(0, 5) === 'blob:') {\n // Special case for handling JavaScript loaded into a blob.\n // We use a synchronous AJAX request here as a blob is already in\n // memory - it's not making a network request. This will generate a warning\n // in the browser console, but there has already been an error so that's not\n // that much of an issue.\n var xhr = new XMLHttpRequest();\n xhr.open('GET', element.url, false);\n xhr.send(null);\n\n // If we failed to download the source, skip this patch\n if (xhr.status === 200) {\n var source = xhr.responseText || '';\n\n // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.\n // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175\n source = source.slice(-300);\n\n // Now we dig out the source map URL\n var sourceMaps = source.match(/\\/\\/# sourceMappingURL=(.*)$/);\n\n // If we don't find a source map comment or we find more than one, continue on to the next element.\n if (sourceMaps) {\n var sourceMapAddress = sourceMaps[1];\n\n // Now we check to see if it's a relative URL.\n // If it is, convert it to an absolute one.\n if (sourceMapAddress.charAt(0) === '~') {\n sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);\n }\n\n // Now we strip the '.map' off of the end of the URL and update the\n // element so that Sentry can match the map to the blob.\n element.url = sourceMapAddress.slice(0, -4);\n }\n }\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.<string, *>} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isErrorEvent = utils.isErrorEvent;\nvar isDOMError = utils.isDOMError;\nvar isDOMException = utils.isDOMException;\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.27.0',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = {};\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} _before A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason, {\n mechanism: {\n type: 'onunhandledrejection',\n handled: false\n }\n });\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isDOMError(ex) || isDOMException(ex)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var name = ex.name || (isDOMError(ex) ? 'DOMError' : 'DOMException');\n var message = ex.message ? name + ': ' + ex.message : name;\n\n return this.captureMessage(\n message,\n objectMerge(options, {\n // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well\n // but it's barely any overhead so we may at least try\n stacktrace: true,\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a DOMError/DOMException\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n\n // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n // initialCall => captureException(string) => captureMessage(string)\n if (initialCall && initialCall.func === 'Raven.captureException') {\n initialCall = stack.stack[2];\n }\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n // Always attempt to get stacktrace if message is empty.\n // It's the only way to provide any helpful information to the user.\n if (this._globalOptions.stacktrace || options.stacktrace || data.message === '') {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = objectMerge(\n {\n eventId: this.lastEventId(),\n dsn: this._dsn,\n user: this._globalContext.user || {}\n },\n options\n );\n\n if (!options.eventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n if (!options.dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var encodedOptions = [];\n\n for (var key in options) {\n if (key === 'user') {\n var user = options.user;\n if (user.name) encodedOptions.push('name=' + encode(user.name));\n if (user.email) encodedOptions.push('email=' + encode(user.email));\n } else {\n encodedOptions.push(encode(key) + '=' + encode(options[key]));\n }\n }\n var globalServer = this._getGlobalServer(this._parseDSN(options.dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/?' + encodedOptions.join('&');\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '<unknown>';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: orig.name || '<anonymous>'}\n }\n },\n originalCallback\n );\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'handleEvent',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn.handleEvent\n );\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'addEventListener',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn,\n before\n ),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'requestAnimationFrame',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n cb\n )\n );\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}\n }\n },\n orig\n );\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'onreadystatechange',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n orig,\n onreadystatechangeHandler\n );\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch\n .apply(this, args)\n .then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n })\n ['catch'](function(err) {\n // if there is an error performing the request\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData,\n level: 'error'\n });\n\n throw err;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else if (_document.attachEvent) {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n _window.history.pushState &&\n _window.history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(_window.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(_window.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function(stackInfo, options) {\n options = options || {};\n options.mechanism = options.mechanism || {\n type: 'onerror',\n handled: false\n };\n\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo(stackInfo, options);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n transaction: fileurl\n },\n options\n );\n\n var ex = data.exception.values[0];\n if (ex.type == null && ex.value === '') {\n ex.value = 'Unrecoverable error caught';\n }\n\n // Move mechanism from options to exception interface\n // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be\n // too much\n if (!data.exception.mechanism && data.mechanism) {\n data.exception.mechanism = data.mechanism;\n delete data.mechanism;\n }\n\n data.exception.mechanism = objectMerge(\n {\n type: 'generic',\n handled: true\n },\n data.exception.mechanism || {}\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': _navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.transaction !== last.transaction // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n if (\n this._originalConsoleMethods[level] &&\n (this.debug || this._globalOptions.debug)\n ) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const { host } = window.location;\n const env = {\n prod: host === 'plyr.io',\n dev: host === 'dev.plyr.io',\n };\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n const selector = '#player';\n const container = document.getElementById('container');\n\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n if (!event.target.classList || container.contains(event.target)) {\n return;\n }\n\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n const focused = document.activeElement;\n\n if (!focused || !focused.classList || container.contains(focused)) {\n return;\n }\n\n focused.classList.add(tabClassName);\n }, 10);\n });\n\n // Setup the player\n const player = new Plyr(selector, {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: env.prod || env.dev,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (\n !(type in types) ||\n (!init && type === currentType) ||\n (!currentType.length && type === types.video)\n ) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [\n {\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n },\n ],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [\n {\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n },\n ],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (env.prod) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (env.prod) {\n ((i, s, o, g, r, a, m) => {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]} \ No newline at end of file
diff --git a/dist/plyr.css b/dist/plyr.css
index b0b125e7..5310d692 100644
--- a/dist/plyr.css
+++ b/dist/plyr.css
@@ -1 +1 @@
-@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--video .plyr__control svg{filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{height:20px;left:2px;position:relative;width:20px}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--hide-controls .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls .plyr__progress+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:2px}.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0;margin-right:auto}.plyr__controls:empty{display:none}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:10px}}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#1aafff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__progress{flex:1;left:7px;margin-right:14px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(183,197,205,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important} \ No newline at end of file
+@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--video .plyr__control svg{filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls .plyr__progress+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:2px}.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0;margin-right:auto}.plyr__controls:empty{display:none}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:10px}}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#1aafff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__progress{flex:1;left:7px;margin-right:14px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(183,197,205,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important} \ No newline at end of file
diff --git a/dist/plyr.js b/dist/plyr.js
index 58de6f96..57702183 100644
--- a/dist/plyr.js
+++ b/dist/plyr.js
@@ -1,8440 +1,7616 @@
typeof navigator === "object" && (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define('Plyr', factory) :
- (global.Plyr = factory());
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define('Plyr', factory) :
+ (global.Plyr = factory());
}(this, (function () { 'use strict';
- // ==========================================================================
- // Type checking utils
- // ==========================================================================
-
- var getConstructor = function getConstructor(input) {
- return input !== null && typeof input !== 'undefined' ? input.constructor : null;
- };
- var instanceOf = function instanceOf(input, constructor) {
- return Boolean(input && constructor && input instanceof constructor);
- };
- var isNullOrUndefined = function isNullOrUndefined(input) {
- return input === null || typeof input === 'undefined';
- };
- var isObject = function isObject(input) {
- return getConstructor(input) === Object;
- };
- var isNumber = function isNumber(input) {
- return getConstructor(input) === Number && !Number.isNaN(input);
- };
- var isString = function isString(input) {
- return getConstructor(input) === String;
- };
- var isBoolean = function isBoolean(input) {
- return getConstructor(input) === Boolean;
- };
- var isFunction = function isFunction(input) {
- return getConstructor(input) === Function;
- };
- var isArray = function isArray(input) {
- return Array.isArray(input);
- };
- var isWeakMap = function isWeakMap(input) {
- return instanceOf(input, WeakMap);
- };
- var isNodeList = function isNodeList(input) {
- return instanceOf(input, NodeList);
- };
- var isElement = function isElement(input) {
- return instanceOf(input, Element);
- };
- var isTextNode = function isTextNode(input) {
- return getConstructor(input) === Text;
- };
- var isEvent = function isEvent(input) {
- return instanceOf(input, Event);
- };
- var isKeyboardEvent = function isKeyboardEvent(input) {
- return instanceOf(input, KeyboardEvent);
- };
- var isCue = function isCue(input) {
- return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);
- };
- var isTrack = function isTrack(input) {
- return instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);
- };
-
- var isEmpty = function isEmpty(input) {
- return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;
- };
-
- var isUrl = function isUrl(input) {
- // Accept a URL object
- if (instanceOf(input, window.URL)) {
- return true;
- }
-
- // Add the protocol if required
- var string = input;
- if (!input.startsWith('http://') || !input.startsWith('https://')) {
- string = 'http://' + input;
- }
-
- try {
- return !isEmpty(new URL(string).hostname);
- } catch (e) {
- return false;
- }
- };
-
- var is = {
- nullOrUndefined: isNullOrUndefined,
- object: isObject,
- number: isNumber,
- string: isString,
- boolean: isBoolean,
- function: isFunction,
- array: isArray,
- weakMap: isWeakMap,
- nodeList: isNodeList,
- element: isElement,
- textNode: isTextNode,
- event: isEvent,
- keyboardEvent: isKeyboardEvent,
- cue: isCue,
- track: isTrack,
- url: isUrl,
- empty: isEmpty
- };
-
- // ==========================================================================
-
- // Check for passive event listener support
- // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
- // https://www.youtube.com/watch?v=NPM6172J22g
- var supportsPassiveListeners = function () {
- // Test via a getter in the options object to see if the passive property is accessed
- var supported = false;
- try {
- var options = Object.defineProperty({}, 'passive', {
- get: function get() {
- supported = true;
- return null;
- }
- });
- window.addEventListener('test', null, options);
- window.removeEventListener('test', null, options);
- } catch (e) {
- // Do nothing
- }
-
- return supported;
- }();
-
- // Toggle event listener
- function toggleListener(element, event, callback) {
- var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
-
- var _this = this;
-
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
-
- // Bail if no element, event, or callback
- if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {
- return;
- }
-
- // Allow multiple events
- var events = event.split(' ');
-
- // Build options
- // Default to just the capture boolean for browsers with no passive listener support
- var options = capture;
-
- // If passive events listeners are supported
- if (supportsPassiveListeners) {
- options = {
- // Whether the listener can be passive (i.e. default never prevented)
- passive: passive,
- // Whether the listener is a capturing listener or not
- capture: capture
- };
- }
-
- // If a single node is passed, bind the event listener
- events.forEach(function (type) {
- if (_this && _this.eventListeners && toggle) {
- // Cache event listener
- _this.eventListeners.push({ element: element, type: type, callback: callback, options: options });
- }
-
- element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
- });
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
}
-
- // Bind event handler
- function on(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
-
- toggleListener.call(this, element, events, callback, true, passive, capture);
+ }
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
}
-
- // Unbind event handler
- function off(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
-
- toggleListener.call(this, element, events, callback, false, passive, capture);
+ }
+
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
}
- // Bind once-only event handler
- function once(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+ return obj;
+ }
- function onceCallback() {
- off(element, events, onceCallback, passive, capture);
+ function _slicedToArray(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
+ }
- for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
+ function _toConsumableArray(arr) {
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
+ }
- callback.apply(this, args);
- }
+ function _arrayWithoutHoles(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
- toggleListener.call(this, element, events, onceCallback, true, passive, capture);
+ return arr2;
}
+ }
- // Trigger event
- function triggerEvent(element) {
- var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
-
- // Bail if no element
- if (!is.element(element) || is.empty(type)) {
- return;
- }
-
- // Create and dispatch the event
- var event = new CustomEvent(type, {
- bubbles: bubbles,
- detail: Object.assign({}, detail, {
- plyr: this
- })
- });
+ function _arrayWithHoles(arr) {
+ if (Array.isArray(arr)) return arr;
+ }
- // Dispatch the event
- element.dispatchEvent(event);
- }
+ function _iterableToArray(iter) {
+ if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
+ }
- // Unbind all cached event listeners
- function unbindListeners() {
- if (this && this.eventListeners) {
- this.eventListeners.forEach(function (item) {
- var element = item.element,
- type = item.type,
- callback = item.callback,
- options = item.options;
+ function _iterableToArrayLimit(arr, i) {
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
- element.removeEventListener(type, callback, options);
- });
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
- this.eventListeners = [];
- }
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"] != null) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
}
- // Run method when / if player is ready
- function ready() {
- var _this2 = this;
+ return _arr;
+ }
- return new Promise(function (resolve) {
- return _this2.ready ? setTimeout(resolve, 0) : on.call(_this2, _this2.elements.container, 'ready', resolve);
- }).then(function () {});
- }
+ function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance");
+ }
- var classCallCheck = function (instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- };
+ function _nonIterableRest() {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ }
- var createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
+ // ==========================================================================
+ // Type checking utils
+ // ==========================================================================
+ var getConstructor = function getConstructor(input) {
+ return input !== null && typeof input !== 'undefined' ? input.constructor : null;
+ };
- return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);
- if (staticProps) defineProperties(Constructor, staticProps);
- return Constructor;
- };
- }();
+ var instanceOf = function instanceOf(input, constructor) {
+ return Boolean(input && constructor && input instanceof constructor);
+ };
- var defineProperty = function (obj, key, value) {
- if (key in obj) {
- Object.defineProperty(obj, key, {
- value: value,
- enumerable: true,
- configurable: true,
- writable: true
- });
- } else {
- obj[key] = value;
- }
+ var isNullOrUndefined = function isNullOrUndefined(input) {
+ return input === null || typeof input === 'undefined';
+ };
- return obj;
- };
+ var isObject = function isObject(input) {
+ return getConstructor(input) === Object;
+ };
- var slicedToArray = function () {
- function sliceIterator(arr, i) {
- var _arr = [];
- var _n = true;
- var _d = false;
- var _e = undefined;
+ var isNumber = function isNumber(input) {
+ return getConstructor(input) === Number && !Number.isNaN(input);
+ };
- try {
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
- _arr.push(_s.value);
+ var isString = function isString(input) {
+ return getConstructor(input) === String;
+ };
- if (i && _arr.length === i) break;
- }
- } catch (err) {
- _d = true;
- _e = err;
- } finally {
- try {
- if (!_n && _i["return"]) _i["return"]();
- } finally {
- if (_d) throw _e;
- }
- }
+ var isBoolean = function isBoolean(input) {
+ return getConstructor(input) === Boolean;
+ };
- return _arr;
- }
+ var isFunction = function isFunction(input) {
+ return getConstructor(input) === Function;
+ };
- return function (arr, i) {
- if (Array.isArray(arr)) {
- return arr;
- } else if (Symbol.iterator in Object(arr)) {
- return sliceIterator(arr, i);
- } else {
- throw new TypeError("Invalid attempt to destructure non-iterable instance");
- }
- };
- }();
+ var isArray = function isArray(input) {
+ return Array.isArray(input);
+ };
- var toConsumableArray = function (arr) {
- if (Array.isArray(arr)) {
- for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ var isWeakMap = function isWeakMap(input) {
+ return instanceOf(input, WeakMap);
+ };
- return arr2;
- } else {
- return Array.from(arr);
- }
- };
+ var isNodeList = function isNodeList(input) {
+ return instanceOf(input, NodeList);
+ };
- // ==========================================================================
+ var isElement = function isElement(input) {
+ return instanceOf(input, Element);
+ };
- // Wrap an element
- function wrap(elements, wrapper) {
- // Convert `elements` to an array, if necessary.
- var targets = elements.length ? elements : [elements];
+ var isTextNode = function isTextNode(input) {
+ return getConstructor(input) === Text;
+ };
- // Loops backwards to prevent having to clone the wrapper on the
- // first element (see `child` below).
- Array.from(targets).reverse().forEach(function (element, index) {
- var child = index > 0 ? wrapper.cloneNode(true) : wrapper;
+ var isEvent = function isEvent(input) {
+ return instanceOf(input, Event);
+ };
- // Cache the current parent and sibling.
- var parent = element.parentNode;
- var sibling = element.nextSibling;
+ var isKeyboardEvent = function isKeyboardEvent(input) {
+ return instanceOf(input, KeyboardEvent);
+ };
- // Wrap the element (is automatically removed from its current
- // parent).
- child.appendChild(element);
+ var isCue = function isCue(input) {
+ return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);
+ };
- // If the element had a sibling, insert the wrapper before
- // the sibling to maintain the HTML structure; otherwise, just
- // append it to the parent.
- if (sibling) {
- parent.insertBefore(child, sibling);
- } else {
- parent.appendChild(child);
- }
- });
- }
+ var isTrack = function isTrack(input) {
+ return instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);
+ };
- // Set attributes
- function setAttributes(element, attributes) {
- if (!is.element(element) || is.empty(attributes)) {
- return;
- }
+ var isEmpty = function isEmpty(input) {
+ return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;
+ };
- // Assume null and undefined attributes should be left out,
- // Setting them would otherwise convert them to "null" and "undefined"
- Object.entries(attributes).filter(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- value = _ref2[1];
+ var isUrl = function isUrl(input) {
+ // Accept a URL object
+ if (instanceOf(input, window.URL)) {
+ return true;
+ } // Add the protocol if required
- return !is.nullOrUndefined(value);
- }).forEach(function (_ref3) {
- var _ref4 = slicedToArray(_ref3, 2),
- key = _ref4[0],
- value = _ref4[1];
- return element.setAttribute(key, value);
- });
- }
+ var string = input;
- // Create a DocumentFragment
- function createElement(type, attributes, text) {
- // Create a new <element>
- var element = document.createElement(type);
+ if (!input.startsWith('http://') || !input.startsWith('https://')) {
+ string = "http://".concat(input);
+ }
- // Set all passed attributes
- if (is.object(attributes)) {
- setAttributes(element, attributes);
+ try {
+ return !isEmpty(new URL(string).hostname);
+ } catch (e) {
+ return false;
+ }
+ };
+
+ var is = {
+ nullOrUndefined: isNullOrUndefined,
+ object: isObject,
+ number: isNumber,
+ string: isString,
+ boolean: isBoolean,
+ function: isFunction,
+ array: isArray,
+ weakMap: isWeakMap,
+ nodeList: isNodeList,
+ element: isElement,
+ textNode: isTextNode,
+ event: isEvent,
+ keyboardEvent: isKeyboardEvent,
+ cue: isCue,
+ track: isTrack,
+ url: isUrl,
+ empty: isEmpty
+ };
+
+ // ==========================================================================
+ // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
+ // https://www.youtube.com/watch?v=NPM6172J22g
+
+ var supportsPassiveListeners = function () {
+ // Test via a getter in the options object to see if the passive property is accessed
+ var supported = false;
+
+ try {
+ var options = Object.defineProperty({}, 'passive', {
+ get: function get() {
+ supported = true;
+ return null;
}
+ });
+ window.addEventListener('test', null, options);
+ window.removeEventListener('test', null, options);
+ } catch (e) {// Do nothing
+ }
- // Add text node
- if (is.string(text)) {
- element.innerText = text;
- }
+ return supported;
+ }(); // Toggle event listener
- // Return built element
- return element;
- }
- // Inaert an element after another
- function insertAfter(element, target) {
- if (!is.element(element) || !is.element(target)) {
- return;
- }
+ function toggleListener(element, event, callback) {
+ var _this = this;
- target.parentNode.insertBefore(element, target.nextSibling);
- }
+ var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
+ var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
- // Insert a DocumentFragment
- function insertElement(type, parent, attributes, text) {
- if (!is.element(parent)) {
- return;
- }
+ // Bail if no element, event, or callback
+ if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {
+ return;
+ } // Allow multiple events
- parent.appendChild(createElement(type, attributes, text));
- }
- // Remove element(s)
- function removeElement(element) {
- if (is.nodeList(element) || is.array(element)) {
- Array.from(element).forEach(removeElement);
- return;
- }
+ var events = event.split(' '); // Build options
+ // Default to just the capture boolean for browsers with no passive listener support
- if (!is.element(element) || !is.element(element.parentNode)) {
- return;
- }
+ var options = capture; // If passive events listeners are supported
- element.parentNode.removeChild(element);
- }
+ if (supportsPassiveListeners) {
+ options = {
+ // Whether the listener can be passive (i.e. default never prevented)
+ passive: passive,
+ // Whether the listener is a capturing listener or not
+ capture: capture
+ };
+ } // If a single node is passed, bind the event listener
- // Remove all child elements
- function emptyElement(element) {
- if (!is.element(element)) {
- return;
- }
- var length = element.childNodes.length;
+ events.forEach(function (type) {
+ if (_this && _this.eventListeners && toggle) {
+ // Cache event listener
+ _this.eventListeners.push({
+ element: element,
+ type: type,
+ callback: callback,
+ options: options
+ });
+ }
+ element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
+ });
+ } // Bind event handler
+
+ function on(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+ toggleListener.call(this, element, events, callback, true, passive, capture);
+ } // Unbind event handler
+
+ function off(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+ toggleListener.call(this, element, events, callback, false, passive, capture);
+ } // Bind once-only event handler
+
+ function once(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+
+ function onceCallback() {
+ off(element, events, onceCallback, passive, capture);
+
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
- while (length > 0) {
- element.removeChild(element.lastChild);
- length -= 1;
- }
+ callback.apply(this, args);
}
- // Replace element
- function replaceElement(newChild, oldChild) {
- if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {
- return null;
- }
+ toggleListener.call(this, element, events, onceCallback, true, passive, capture);
+ } // Trigger event
+
+ function triggerEvent(element) {
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+
+ // Bail if no element
+ if (!is.element(element) || is.empty(type)) {
+ return;
+ } // Create and dispatch the event
+
+
+ var event = new CustomEvent(type, {
+ bubbles: bubbles,
+ detail: Object.assign({}, detail, {
+ plyr: this
+ })
+ }); // Dispatch the event
+
+ element.dispatchEvent(event);
+ } // Unbind all cached event listeners
+
+ function unbindListeners() {
+ if (this && this.eventListeners) {
+ this.eventListeners.forEach(function (item) {
+ var element = item.element,
+ type = item.type,
+ callback = item.callback,
+ options = item.options;
+ element.removeEventListener(type, callback, options);
+ });
+ this.eventListeners = [];
+ }
+ } // Run method when / if player is ready
- oldChild.parentNode.replaceChild(newChild, oldChild);
+ function ready() {
+ var _this2 = this;
- return newChild;
- }
+ return new Promise(function (resolve) {
+ return _this2.ready ? setTimeout(resolve, 0) : on.call(_this2, _this2.elements.container, 'ready', resolve);
+ }).then(function () {});
+ }
- // Get an attribute object from a string selector
- function getAttributesFromSelector(sel, existingAttributes) {
- // For example:
- // '.test' to { class: 'test' }
- // '#test' to { id: 'test' }
- // '[data-test="test"]' to { 'data-test': 'test' }
+ function wrap(elements, wrapper) {
+ // Convert `elements` to an array, if necessary.
+ var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the
+ // first element (see `child` below).
- if (!is.string(sel) || is.empty(sel)) {
- return {};
- }
+ Array.from(targets).reverse().forEach(function (element, index) {
+ var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.
- var attributes = {};
- var existing = existingAttributes;
+ var parent = element.parentNode;
+ var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current
+ // parent).
- sel.split(',').forEach(function (s) {
- // Remove whitespace
- var selector = s.trim();
- var className = selector.replace('.', '');
- var stripped = selector.replace(/[[\]]/g, '');
+ child.appendChild(element); // If the element had a sibling, insert the wrapper before
+ // the sibling to maintain the HTML structure; otherwise, just
+ // append it to the parent.
- // Get the parts and value
- var parts = stripped.split('=');
- var key = parts[0];
- var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : '';
+ if (sibling) {
+ parent.insertBefore(child, sibling);
+ } else {
+ parent.appendChild(child);
+ }
+ });
+ } // Set attributes
- // Get the first character
- var start = selector.charAt(0);
+ function setAttributes(element, attributes) {
+ if (!is.element(element) || is.empty(attributes)) {
+ return;
+ } // Assume null and undefined attributes should be left out,
+ // Setting them would otherwise convert them to "null" and "undefined"
- switch (start) {
- case '.':
- // Add to existing classname
- if (is.object(existing) && is.string(existing.class)) {
- existing.class += ' ' + className;
- }
- attributes.class = className;
- break;
+ Object.entries(attributes).filter(function (_ref) {
+ var _ref2 = _slicedToArray(_ref, 2),
+ value = _ref2[1];
- case '#':
- // ID selector
- attributes.id = selector.replace('#', '');
- break;
+ return !is.nullOrUndefined(value);
+ }).forEach(function (_ref3) {
+ var _ref4 = _slicedToArray(_ref3, 2),
+ key = _ref4[0],
+ value = _ref4[1];
- case '[':
- // Attribute selector
- attributes[key] = value;
+ return element.setAttribute(key, value);
+ });
+ } // Create a DocumentFragment
- break;
+ function createElement(type, attributes, text) {
+ // Create a new <element>
+ var element = document.createElement(type); // Set all passed attributes
- default:
- break;
- }
- });
+ if (is.object(attributes)) {
+ setAttributes(element, attributes);
+ } // Add text node
- return attributes;
- }
- // Toggle hidden
- function toggleHidden(element, hidden) {
- if (!is.element(element)) {
- return;
- }
+ if (is.string(text)) {
+ element.innerText = text;
+ } // Return built element
- var hide = hidden;
- if (!is.boolean(hide)) {
- hide = !element.hidden;
- }
+ return element;
+ } // Inaert an element after another
- if (hide) {
- element.setAttribute('hidden', '');
- } else {
- element.removeAttribute('hidden');
- }
+ function insertAfter(element, target) {
+ if (!is.element(element) || !is.element(target)) {
+ return;
}
- // Mirror Element.classList.toggle, with IE compatibility for "force" argument
- function toggleClass(element, className, force) {
- if (is.nodeList(element)) {
- return Array.from(element).map(function (e) {
- return toggleClass(e, className, force);
- });
- }
+ target.parentNode.insertBefore(element, target.nextSibling);
+ } // Insert a DocumentFragment
- if (is.element(element)) {
- var method = 'toggle';
- if (typeof force !== 'undefined') {
- method = force ? 'add' : 'remove';
- }
+ function insertElement(type, parent, attributes, text) {
+ if (!is.element(parent)) {
+ return;
+ }
- element.classList[method](className);
- return element.classList.contains(className);
- }
+ parent.appendChild(createElement(type, attributes, text));
+ } // Remove element(s)
- return false;
+ function removeElement(element) {
+ if (is.nodeList(element) || is.array(element)) {
+ Array.from(element).forEach(removeElement);
+ return;
}
- // Has class name
- function hasClass(element, className) {
- return is.element(element) && element.classList.contains(className);
+ if (!is.element(element) || !is.element(element.parentNode)) {
+ return;
}
- // Element matches selector
- function matches(element, selector) {
- var prototype = { Element: Element };
+ element.parentNode.removeChild(element);
+ } // Remove all child elements
- function match() {
- return Array.from(document.querySelectorAll(selector)).includes(this);
- }
+ function emptyElement(element) {
+ if (!is.element(element)) {
+ return;
+ }
- var matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
+ var length = element.childNodes.length;
- return matches.call(element, selector);
+ while (length > 0) {
+ element.removeChild(element.lastChild);
+ length -= 1;
}
+ } // Replace element
- // Find all elements
- function getElements(selector) {
- return this.elements.container.querySelectorAll(selector);
+ function replaceElement(newChild, oldChild) {
+ if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {
+ return null;
}
- // Find a single element
- function getElement(selector) {
- return this.elements.container.querySelector(selector);
+ oldChild.parentNode.replaceChild(newChild, oldChild);
+ return newChild;
+ } // Get an attribute object from a string selector
+
+ function getAttributesFromSelector(sel, existingAttributes) {
+ // For example:
+ // '.test' to { class: 'test' }
+ // '#test' to { id: 'test' }
+ // '[data-test="test"]' to { 'data-test': 'test' }
+ if (!is.string(sel) || is.empty(sel)) {
+ return {};
}
- // Trap focus inside container
- function trapFocus() {
- var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var attributes = {};
+ var existing = existingAttributes;
+ sel.split(',').forEach(function (s) {
+ // Remove whitespace
+ var selector = s.trim();
+ var className = selector.replace('.', '');
+ var stripped = selector.replace(/[[\]]/g, ''); // Get the parts and value
+
+ var parts = stripped.split('=');
+ var key = parts[0];
+ var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : ''; // Get the first character
+
+ var start = selector.charAt(0);
+
+ switch (start) {
+ case '.':
+ // Add to existing classname
+ if (is.object(existing) && is.string(existing.class)) {
+ existing.class += " ".concat(className);
+ }
- if (!is.element(element)) {
- return;
- }
+ attributes.class = className;
+ break;
- var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
- var first = focusable[0];
- var last = focusable[focusable.length - 1];
+ case '#':
+ // ID selector
+ attributes.id = selector.replace('#', '');
+ break;
- var trap = function trap(event) {
- // Bail if not tab key or not fullscreen
- if (event.key !== 'Tab' || event.keyCode !== 9) {
- return;
- }
+ case '[':
+ // Attribute selector
+ attributes[key] = value;
+ break;
- // Get the current focused element
- var focused = document.activeElement;
-
- if (focused === last && !event.shiftKey) {
- // Move focus to first element that can be tabbed if Shift isn't used
- first.focus();
- event.preventDefault();
- } else if (focused === first && event.shiftKey) {
- // Move focus to last element that can be tabbed if Shift is used
- last.focus();
- event.preventDefault();
- }
- };
+ default:
+ break;
+ }
+ });
+ return attributes;
+ } // Toggle hidden
- toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
+ function toggleHidden(element, hidden) {
+ if (!is.element(element)) {
+ return;
}
- // Set focus and tab focus class
- function setFocus() {
- var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var hide = hidden;
- if (!is.element(element)) {
- return;
- }
+ if (!is.boolean(hide)) {
+ hide = !element.hidden;
+ }
- // Set regular focus
- element.focus();
+ if (hide) {
+ element.setAttribute('hidden', '');
+ } else {
+ element.removeAttribute('hidden');
+ }
+ } // Mirror Element.classList.toggle, with IE compatibility for "force" argument
- // If we want to mimic keyboard focus via tab
- if (tabFocus) {
- toggleClass(element, this.config.classNames.tabFocus);
- }
+ function toggleClass(element, className, force) {
+ if (is.nodeList(element)) {
+ return Array.from(element).map(function (e) {
+ return toggleClass(e, className, force);
+ });
}
- // ==========================================================================
+ if (is.element(element)) {
+ var method = 'toggle';
- var transitionEndEvent = function () {
- var element = document.createElement('span');
+ if (typeof force !== 'undefined') {
+ method = force ? 'add' : 'remove';
+ }
- var events = {
- WebkitTransition: 'webkitTransitionEnd',
- MozTransition: 'transitionend',
- OTransition: 'oTransitionEnd otransitionend',
- transition: 'transitionend'
- };
+ element.classList[method](className);
+ return element.classList.contains(className);
+ }
- var type = Object.keys(events).find(function (event) {
- return element.style[event] !== undefined;
- });
+ return false;
+ } // Has class name
- return is.string(type) ? events[type] : false;
- }();
+ function hasClass(element, className) {
+ return is.element(element) && element.classList.contains(className);
+ } // Element matches selector
- // Force repaint of element
- function repaint(element) {
- setTimeout(function () {
- try {
- toggleHidden(element, true);
- element.offsetHeight; // eslint-disable-line
- toggleHidden(element, false);
- } catch (e) {
- // Do nothing
- }
- }, 0);
+ function matches(element, selector) {
+ var prototype = {
+ Element: Element
+ };
+
+ function match() {
+ return Array.from(document.querySelectorAll(selector)).includes(this);
}
- // ==========================================================================
- // Browser sniffing
- // Unfortunately, due to mixed support, UA sniffing is required
- // ==========================================================================
+ var matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
+ return matches.call(element, selector);
+ } // Find all elements
- var browser = {
- isIE: /* @cc_on!@ */!!document.documentMode,
- isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
- isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
- isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
- };
+ function getElements(selector) {
+ return this.elements.container.querySelectorAll(selector);
+ } // Find a single element
- // ==========================================================================
+ function getElement(selector) {
+ return this.elements.container.querySelector(selector);
+ } // Trap focus inside container
- // Default codecs for checking mimetype support
- var defaultCodecs = {
- 'audio/ogg': 'vorbis',
- 'audio/wav': '1',
- 'video/webm': 'vp8, vorbis',
- 'video/mp4': 'avc1.42E01E, mp4a.40.2',
- 'video/ogg': 'theora'
- };
+ function trapFocus() {
+ var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- // Check for feature support
- var support = {
- // Basic support
- audio: 'canPlayType' in document.createElement('audio'),
- video: 'canPlayType' in document.createElement('video'),
-
- // Check for support
- // Basic functionality vs full UI
- check: function check(type, provider, playsinline) {
- var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
- var api = support[type] || provider !== 'html5';
- var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
-
- return {
- api: api,
- ui: ui
- };
- },
+ if (!is.element(element)) {
+ return;
+ }
+ var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
+ var first = focusable[0];
+ var last = focusable[focusable.length - 1];
- // Picture-in-picture support
- // Safari only currently
- pip: function () {
- return !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode);
- }(),
+ var trap = function trap(event) {
+ // Bail if not tab key or not fullscreen
+ if (event.key !== 'Tab' || event.keyCode !== 9) {
+ return;
+ } // Get the current focused element
- // Airplay support
- // Safari only currently
- airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),
- // Inline playback support
- // https://webkit.org/blog/6784/new-video-policies-for-ios/
- playsinline: 'playsInline' in document.createElement('video'),
+ var focused = document.activeElement;
- // Check for mime type support against a player instance
- // Credits: http://diveintohtml5.info/everything.html
- // Related: http://www.leanbackplayer.com/test/h5mt.html
- mime: function mime(inputType) {
- var _inputType$split = inputType.split('/'),
- _inputType$split2 = slicedToArray(_inputType$split, 1),
- mediaType = _inputType$split2[0];
+ if (focused === last && !event.shiftKey) {
+ // Move focus to first element that can be tabbed if Shift isn't used
+ first.focus();
+ event.preventDefault();
+ } else if (focused === first && event.shiftKey) {
+ // Move focus to last element that can be tabbed if Shift is used
+ last.focus();
+ event.preventDefault();
+ }
+ };
- if (!this.isHTML5 || mediaType !== this.type) {
- return false;
- }
+ toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
+ } // Set focus and tab focus class
- var type = void 0;
- if (inputType && inputType.includes('codecs=')) {
- // Use input directly
- type = inputType;
- } else if (inputType === 'audio/mpeg') {
- // Skip codec
- type = 'audio/mpeg;';
- } else if (inputType in defaultCodecs) {
- // Use codec
- type = inputType + '; codecs="' + defaultCodecs[inputType] + '"';
- }
+ function setFocus() {
+ var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- try {
- return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
- } catch (err) {
- return false;
- }
- },
+ if (!is.element(element)) {
+ return;
+ } // Set regular focus
- // Check for textTracks support
- textTracks: 'textTracks' in document.createElement('video'),
+ element.focus(); // If we want to mimic keyboard focus via tab
- // <input type="range"> Sliders
- rangeInput: function () {
- var range = document.createElement('input');
- range.type = 'range';
- return range.type === 'range';
- }(),
+ if (tabFocus) {
+ toggleClass(element, this.config.classNames.tabFocus);
+ }
+ }
+
+ // ==========================================================================
+ var transitionEndEvent = function () {
+ var element = document.createElement('span');
+ var events = {
+ WebkitTransition: 'webkitTransitionEnd',
+ MozTransition: 'transitionend',
+ OTransition: 'oTransitionEnd otransitionend',
+ transition: 'transitionend'
+ };
+ var type = Object.keys(events).find(function (event) {
+ return element.style[event] !== undefined;
+ });
+ return is.string(type) ? events[type] : false;
+ }(); // Force repaint of element
- // Touch
- // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
- touch: 'ontouchstart' in document.documentElement,
+ function repaint(element) {
+ setTimeout(function () {
+ try {
+ toggleHidden(element, true);
+ element.offsetHeight; // eslint-disable-line
- // Detect transitions support
- transitions: transitionEndEvent !== false,
+ toggleHidden(element, false);
+ } catch (e) {// Do nothing
+ }
+ }, 0);
+ }
+
+ // ==========================================================================
+ // Browser sniffing
+ // Unfortunately, due to mixed support, UA sniffing is required
+ // ==========================================================================
+ var browser = {
+ isIE:
+ /* @cc_on!@ */
+ !!document.documentMode,
+ isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
+ isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
+ isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
+ };
+
+ var defaultCodecs = {
+ 'audio/ogg': 'vorbis',
+ 'audio/wav': '1',
+ 'video/webm': 'vp8, vorbis',
+ 'video/mp4': 'avc1.42E01E, mp4a.40.2',
+ 'video/ogg': 'theora'
+ }; // Check for feature support
+
+ var support = {
+ // Basic support
+ audio: 'canPlayType' in document.createElement('audio'),
+ video: 'canPlayType' in document.createElement('video'),
+ // Check for support
+ // Basic functionality vs full UI
+ check: function check(type, provider, playsinline) {
+ var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
+ var api = support[type] || provider !== 'html5';
+ var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
+ return {
+ api: api,
+ ui: ui
+ };
+ },
+ // Picture-in-picture support
+ // Safari only currently
+ pip: function () {
+ return !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode);
+ }(),
+ // Airplay support
+ // Safari only currently
+ airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),
+ // Inline playback support
+ // https://webkit.org/blog/6784/new-video-policies-for-ios/
+ playsinline: 'playsInline' in document.createElement('video'),
+ // Check for mime type support against a player instance
+ // Credits: http://diveintohtml5.info/everything.html
+ // Related: http://www.leanbackplayer.com/test/h5mt.html
+ mime: function mime(inputType) {
+ var _inputType$split = inputType.split('/'),
+ _inputType$split2 = _slicedToArray(_inputType$split, 1),
+ mediaType = _inputType$split2[0];
+
+ if (!this.isHTML5 || mediaType !== this.type) {
+ return false;
+ }
- // Reduced motion iOS & MacOS setting
- // https://webkit.org/blog/7551/responsive-design-for-motion/
- reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
- };
+ var type;
+
+ if (inputType && inputType.includes('codecs=')) {
+ // Use input directly
+ type = inputType;
+ } else if (inputType === 'audio/mpeg') {
+ // Skip codec
+ type = 'audio/mpeg;';
+ } else if (inputType in defaultCodecs) {
+ // Use codec
+ type = "".concat(inputType, "; codecs=\"").concat(defaultCodecs[inputType], "\"");
+ }
- // ==========================================================================
+ try {
+ return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
+ } catch (err) {
+ return false;
+ }
+ },
+ // Check for textTracks support
+ textTracks: 'textTracks' in document.createElement('video'),
+ // <input type="range"> Sliders
+ rangeInput: function () {
+ var range = document.createElement('input');
+ range.type = 'range';
+ return range.type === 'range';
+ }(),
+ // Touch
+ // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
+ touch: 'ontouchstart' in document.documentElement,
+ // Detect transitions support
+ transitions: transitionEndEvent !== false,
+ // Reduced motion iOS & MacOS setting
+ // https://webkit.org/blog/7551/responsive-design-for-motion/
+ reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
+ };
+
+ // ==========================================================================
+ var html5 = {
+ getSources: function getSources() {
+ var _this = this;
+
+ if (!this.isHTML5) {
+ return [];
+ }
- var html5 = {
- getSources: function getSources() {
- var _this = this;
+ var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources
- if (!this.isHTML5) {
- return [];
- }
+ return sources.filter(function (source) {
+ return support.mime.call(_this, source.getAttribute('type'));
+ });
+ },
+ // Get quality levels
+ getQualityOptions: function getQualityOptions() {
+ // Get sizes from <source> elements
+ return html5.getSources.call(this).map(function (source) {
+ return Number(source.getAttribute('size'));
+ }).filter(Boolean);
+ },
+ extend: function extend() {
+ if (!this.isHTML5) {
+ return;
+ }
- var sources = Array.from(this.media.querySelectorAll('source'));
+ var player = this; // Quality
- // Filter out unsupported sources
- return sources.filter(function (source) {
- return support.mime.call(_this, source.getAttribute('type'));
- });
+ Object.defineProperty(player.media, 'quality', {
+ get: function get() {
+ // Get sources
+ var sources = html5.getSources.call(player);
+ var source = sources.find(function (source) {
+ return source.getAttribute('src') === player.source;
+ }); // Return size, if match is found
+
+ return source && Number(source.getAttribute('size'));
},
+ set: function set(input) {
+ // Get sources
+ var sources = html5.getSources.call(player); // Get first match for requested size
+ var source = sources.find(function (source) {
+ return Number(source.getAttribute('size')) === input;
+ }); // No matching source found
- // Get quality levels
- getQualityOptions: function getQualityOptions() {
- // Get sizes from <source> elements
- return html5.getSources.call(this).map(function (source) {
- return Number(source.getAttribute('size'));
- }).filter(Boolean);
- },
- extend: function extend() {
- if (!this.isHTML5) {
- return;
- }
+ if (!source) {
+ return;
+ } // Get current state
- var player = this;
-
- // Quality
- Object.defineProperty(player.media, 'quality', {
- get: function get() {
- // Get sources
- var sources = html5.getSources.call(player);
- var source = sources.find(function (source) {
- return source.getAttribute('src') === player.source;
- });
-
- // Return size, if match is found
- return source && Number(source.getAttribute('size'));
- },
- set: function set(input) {
- // Get sources
- var sources = html5.getSources.call(player);
-
- // Get first match for requested size
- var source = sources.find(function (source) {
- return Number(source.getAttribute('size')) === input;
- });
-
- // No matching source found
- if (!source) {
- return;
- }
-
- // Get current state
- var _player$media = player.media,
- currentTime = _player$media.currentTime,
- paused = _player$media.paused,
- preload = _player$media.preload,
- readyState = _player$media.readyState;
-
- // Set new source
-
- player.media.src = source.getAttribute('src');
-
- // Prevent loading if preload="none" and the current source isn't loaded (#1044)
- if (preload !== 'none' || readyState) {
- // Restore time
- player.once('loadedmetadata', function () {
- player.currentTime = currentTime;
-
- // Resume playing
- if (!paused) {
- player.play();
- }
- });
-
- // Load new source
- player.media.load();
- }
-
- // Trigger change event
- triggerEvent.call(player, player.media, 'qualitychange', false, {
- quality: input
- });
-
- // Save to storage
- player.storage.set({ quality: input });
- }
- });
- },
+ var _player$media = player.media,
+ currentTime = _player$media.currentTime,
+ paused = _player$media.paused,
+ preload = _player$media.preload,
+ readyState = _player$media.readyState; // Set new source
- // Cancel current network requests
- // See https://github.com/sampotts/plyr/issues/174
- cancelRequests: function cancelRequests() {
- if (!this.isHTML5) {
- return;
- }
+ player.media.src = source.getAttribute('src'); // Prevent loading if preload="none" and the current source isn't loaded (#1044)
- // Remove child sources
- removeElement(html5.getSources.call(this));
+ if (preload !== 'none' || readyState) {
+ // Restore time
+ player.once('loadedmetadata', function () {
+ player.currentTime = currentTime; // Resume playing
- // Set blank video src attribute
- // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
- // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
- this.media.setAttribute('src', this.config.blankVideo);
+ if (!paused) {
+ player.play();
+ }
+ }); // Load new source
- // Load the new empty source
- // This will cancel existing requests
- // See https://github.com/sampotts/plyr/issues/174
- this.media.load();
+ player.media.load();
+ } // Trigger change event
- // Debugging
- this.debug.log('Cancelled network requests');
- }
- };
- // ==========================================================================
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
+ quality: input
+ }); // Save to storage
- // Remove duplicates in an array
- function dedupe(array) {
- if (!is.array(array)) {
- return array;
+ player.storage.set({
+ quality: input
+ });
}
+ });
+ },
+ // Cancel current network requests
+ // See https://github.com/sampotts/plyr/issues/174
+ cancelRequests: function cancelRequests() {
+ if (!this.isHTML5) {
+ return;
+ } // Remove child sources
- return array.filter(function (item, index) {
- return array.indexOf(item) === index;
- });
- }
- // Get the closest value in an array
- function closest(array, value) {
- if (!is.array(array) || !array.length) {
- return null;
- }
+ removeElement(html5.getSources.call(this)); // Set blank video src attribute
+ // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
+ // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
- return array.reduce(function (prev, curr) {
- return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
- });
- }
+ this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source
+ // This will cancel existing requests
+ // See https://github.com/sampotts/plyr/issues/174
- // ==========================================================================
+ this.media.load(); // Debugging
- // Clone nested objects
- function cloneDeep(object) {
- return JSON.parse(JSON.stringify(object));
+ this.debug.log('Cancelled network requests');
}
+ };
+
+ // ==========================================================================
- // Get a nested value in an object
- function getDeep(object, path) {
- return path.split('.').reduce(function (obj, key) {
- return obj && obj[key];
- }, object);
+ function dedupe(array) {
+ if (!is.array(array)) {
+ return array;
}
- // Deep extend destination object with N more objects
- function extend() {
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ return array.filter(function (item, index) {
+ return array.indexOf(item) === index;
+ });
+ } // Get the closest value in an array
- for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- sources[_key - 1] = arguments[_key];
- }
+ function closest(array, value) {
+ if (!is.array(array) || !array.length) {
+ return null;
+ }
- if (!sources.length) {
- return target;
- }
+ return array.reduce(function (prev, curr) {
+ return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
+ });
+ }
- var source = sources.shift();
+ function cloneDeep(object) {
+ return JSON.parse(JSON.stringify(object));
+ } // Get a nested value in an object
- if (!is.object(source)) {
- return target;
- }
+ function getDeep(object, path) {
+ return path.split('.').reduce(function (obj, key) {
+ return obj && obj[key];
+ }, object);
+ } // Deep extend destination object with N more objects
- Object.keys(source).forEach(function (key) {
- if (is.object(source[key])) {
- if (!Object.keys(target).includes(key)) {
- Object.assign(target, defineProperty({}, key, {}));
- }
+ function extend() {
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- extend(target[key], source[key]);
- } else {
- Object.assign(target, defineProperty({}, key, source[key]));
- }
- });
+ for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ sources[_key - 1] = arguments[_key];
+ }
- return extend.apply(undefined, [target].concat(sources));
+ if (!sources.length) {
+ return target;
}
- // ==========================================================================
+ var source = sources.shift();
- // Generate a random ID
- function generateId(prefix) {
- return prefix + '-' + Math.floor(Math.random() * 10000);
+ if (!is.object(source)) {
+ return target;
}
- // Format string
- function format(input) {
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
+ Object.keys(source).forEach(function (key) {
+ if (is.object(source[key])) {
+ if (!Object.keys(target).includes(key)) {
+ Object.assign(target, _defineProperty({}, key, {}));
}
- if (is.empty(input)) {
- return input;
- }
+ extend(target[key], source[key]);
+ } else {
+ Object.assign(target, _defineProperty({}, key, source[key]));
+ }
+ });
+ return extend.apply(void 0, [target].concat(sources));
+ }
- return input.toString().replace(/{(\d+)}/g, function (match, i) {
- return args[i].toString();
- });
- }
+ // ==========================================================================
- // Get percentage
- function getPercentage(current, max) {
- if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
- return 0;
- }
+ function generateId(prefix) {
+ return "".concat(prefix, "-").concat(Math.floor(Math.random() * 10000));
+ } // Format string
- return (current / max * 100).toFixed(2);
+ function format(input) {
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
}
- // Replace all occurances of a string in a string
- function replaceAll() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
-
- return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
+ if (is.empty(input)) {
+ return input;
}
- // Convert to title case
- function toTitleCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ return input.toString().replace(/{(\d+)}/g, function (match, i) {
+ return args[i].toString();
+ });
+ } // Get percentage
- return input.toString().replace(/\w\S*/g, function (text) {
- return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
- });
+ function getPercentage(current, max) {
+ if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
+ return 0;
}
- // Convert string to pascalCase
- function toPascalCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
-
- var string = input.toString();
+ return (current / max * 100).toFixed(2);
+ } // Replace all occurances of a string in a string
- // Convert kebab case
- string = replaceAll(string, '-', ' ');
+ function replaceAll() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
+ return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
+ } // Convert to title case
- // Convert snake case
- string = replaceAll(string, '_', ' ');
+ function toTitleCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ return input.toString().replace(/\w\S*/g, function (text) {
+ return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
+ });
+ } // Convert string to pascalCase
- // Convert to title case
- string = toTitleCase(string);
+ function toPascalCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var string = input.toString(); // Convert kebab case
- // Convert to pascal case
- return replaceAll(string, ' ', '');
- }
+ string = replaceAll(string, '-', ' '); // Convert snake case
- // Convert string to pascalCase
- function toCamelCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ string = replaceAll(string, '_', ' '); // Convert to title case
- var string = input.toString();
+ string = toTitleCase(string); // Convert to pascal case
- // Convert to pascal case
- string = toPascalCase(string);
+ return replaceAll(string, ' ', '');
+ } // Convert string to pascalCase
- // Convert first character to lowercase
- return string.charAt(0).toLowerCase() + string.slice(1);
- }
+ function toCamelCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var string = input.toString(); // Convert to pascal case
- // Remove HTML from a string
- function stripHTML(source) {
- var fragment = document.createDocumentFragment();
- var element = document.createElement('div');
- fragment.appendChild(element);
- element.innerHTML = source;
- return fragment.firstChild.innerText;
- }
+ string = toPascalCase(string); // Convert first character to lowercase
- // Like outerHTML, but also works for DocumentFragment
- function getHTML(element) {
- var wrapper = document.createElement('div');
- wrapper.appendChild(element);
- return wrapper.innerHTML;
- }
+ return string.charAt(0).toLowerCase() + string.slice(1);
+ } // Remove HTML from a string
- // ==========================================================================
+ function stripHTML(source) {
+ var fragment = document.createDocumentFragment();
+ var element = document.createElement('div');
+ fragment.appendChild(element);
+ element.innerHTML = source;
+ return fragment.firstChild.innerText;
+ } // Like outerHTML, but also works for DocumentFragment
- var i18n = {
- get: function get$$1() {
- var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ function getHTML(element) {
+ var wrapper = document.createElement('div');
+ wrapper.appendChild(element);
+ return wrapper.innerHTML;
+ }
- if (is.empty(key) || is.empty(config)) {
- return '';
- }
+ var i18n = {
+ get: function get() {
+ var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var string = getDeep(config.i18n, key);
+ if (is.empty(key) || is.empty(config)) {
+ return '';
+ }
- if (is.empty(string)) {
- return '';
- }
+ var string = getDeep(config.i18n, key);
- var replace = {
- '{seektime}': config.seekTime,
- '{title}': config.title
- };
+ if (is.empty(string)) {
+ return '';
+ }
- Object.entries(replace).forEach(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- key = _ref2[0],
- value = _ref2[1];
+ var replace = {
+ '{seektime}': config.seekTime,
+ '{title}': config.title
+ };
+ Object.entries(replace).forEach(function (_ref) {
+ var _ref2 = _slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
- string = replaceAll(string, key, value);
- });
+ string = replaceAll(string, key, value);
+ });
+ return string;
+ }
+ };
- return string;
- }
- };
+ var Storage =
+ /*#__PURE__*/
+ function () {
+ function Storage(player) {
+ _classCallCheck(this, Storage);
- // ==========================================================================
+ this.enabled = player.config.storage.enabled;
+ this.key = player.config.storage.key;
+ } // Check for actual support (see if we can use it)
- var Storage = function () {
- function Storage(player) {
- classCallCheck(this, Storage);
- this.enabled = player.config.storage.enabled;
- this.key = player.config.storage.key;
+ _createClass(Storage, [{
+ key: "get",
+ value: function get(key) {
+ if (!Storage.supported || !this.enabled) {
+ return null;
}
- // Check for actual support (see if we can use it)
+ var store = window.localStorage.getItem(this.key);
+ if (is.empty(store)) {
+ return null;
+ }
- createClass(Storage, [{
- key: 'get',
- value: function get$$1(key) {
- if (!Storage.supported || !this.enabled) {
- return null;
- }
-
- var store = window.localStorage.getItem(this.key);
+ var json = JSON.parse(store);
+ return is.string(key) && key.length ? json[key] : json;
+ }
+ }, {
+ key: "set",
+ value: function set(object) {
+ // Bail if we don't have localStorage support or it's disabled
+ if (!Storage.supported || !this.enabled) {
+ return;
+ } // Can only store objectst
- if (is.empty(store)) {
- return null;
- }
- var json = JSON.parse(store);
+ if (!is.object(object)) {
+ return;
+ } // Get current storage
- return is.string(key) && key.length ? json[key] : json;
- }
- }, {
- key: 'set',
- value: function set$$1(object) {
- // Bail if we don't have localStorage support or it's disabled
- if (!Storage.supported || !this.enabled) {
- return;
- }
- // Can only store objectst
- if (!is.object(object)) {
- return;
- }
+ var storage = this.get(); // Default to empty object
- // Get current storage
- var storage = this.get();
+ if (is.empty(storage)) {
+ storage = {};
+ } // Update the working copy of the values
- // Default to empty object
- if (is.empty(storage)) {
- storage = {};
- }
- // Update the working copy of the values
- extend(storage, object);
+ extend(storage, object); // Update storage
- // Update storage
- window.localStorage.setItem(this.key, JSON.stringify(storage));
- }
- }], [{
- key: 'supported',
- get: function get$$1() {
- try {
- if (!('localStorage' in window)) {
- return false;
- }
-
- var test = '___test';
-
- // Try to use it (it might be disabled, e.g. user is in private mode)
- // see: https://github.com/sampotts/plyr/issues/131
- window.localStorage.setItem(test, test);
- window.localStorage.removeItem(test);
-
- return true;
- } catch (e) {
- return false;
- }
- }
- }]);
- return Storage;
- }();
+ window.localStorage.setItem(this.key, JSON.stringify(storage));
+ }
+ }], [{
+ key: "supported",
+ get: function get() {
+ try {
+ if (!('localStorage' in window)) {
+ return false;
+ }
- // ==========================================================================
- // Fetch wrapper
- // Using XHR to avoid issues with older browsers
- // ==========================================================================
+ var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)
+ // see: https://github.com/sampotts/plyr/issues/131
- function fetch(url) {
- var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
+ window.localStorage.setItem(test, test);
+ window.localStorage.removeItem(test);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+ }]);
+
+ return Storage;
+ }();
+
+ // ==========================================================================
+ // Fetch wrapper
+ // Using XHR to avoid issues with older browsers
+ // ==========================================================================
+ function fetch(url) {
+ var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
+ return new Promise(function (resolve, reject) {
+ try {
+ var request = new XMLHttpRequest(); // Check for CORS support
+
+ if (!('withCredentials' in request)) {
+ return;
+ }
- return new Promise(function (resolve, reject) {
+ request.addEventListener('load', function () {
+ if (responseType === 'text') {
try {
- var request = new XMLHttpRequest();
-
- // Check for CORS support
- if (!('withCredentials' in request)) {
- return;
- }
-
- request.addEventListener('load', function () {
- if (responseType === 'text') {
- try {
- resolve(JSON.parse(request.responseText));
- } catch (e) {
- resolve(request.responseText);
- }
- } else {
- resolve(request.response);
- }
- });
-
- request.addEventListener('error', function () {
- throw new Error(request.status);
- });
-
- request.open('GET', url, true);
-
- // Set the required response type
- request.responseType = responseType;
-
- request.send();
+ resolve(JSON.parse(request.responseText));
} catch (e) {
- reject(e);
+ resolve(request.responseText);
}
+ } else {
+ resolve(request.response);
+ }
});
- }
-
- // ==========================================================================
-
- // Load an external SVG sprite
- function loadSprite(url, id) {
- if (!is.string(url)) {
- return;
- }
-
- var prefix = 'cache';
- var hasId = is.string(id);
- var isCached = false;
+ request.addEventListener('error', function () {
+ throw new Error(request.status);
+ });
+ request.open('GET', url, true); // Set the required response type
- var exists = function exists() {
- return document.getElementById(id) !== null;
- };
+ request.responseType = responseType;
+ request.send();
+ } catch (e) {
+ reject(e);
+ }
+ });
+ }
- var update = function update(container, data) {
- container.innerHTML = data;
+ // ==========================================================================
- // Check again incase of race condition
- if (hasId && exists()) {
- return;
- }
+ function loadSprite(url, id) {
+ if (!is.string(url)) {
+ return;
+ }
- // Inject the SVG to the body
- document.body.insertAdjacentElement('afterbegin', container);
- };
+ var prefix = 'cache';
+ var hasId = is.string(id);
+ var isCached = false;
- // Only load once if ID set
- if (!hasId || !exists()) {
- var useStorage = Storage.supported;
+ var exists = function exists() {
+ return document.getElementById(id) !== null;
+ };
- // Create container
- var container = document.createElement('div');
- container.setAttribute('hidden', '');
+ var update = function update(container, data) {
+ container.innerHTML = data; // Check again incase of race condition
- if (hasId) {
- container.setAttribute('id', id);
- }
+ if (hasId && exists()) {
+ return;
+ } // Inject the SVG to the body
- // Check in cache
- if (useStorage) {
- var cached = window.localStorage.getItem(prefix + '-' + id);
- isCached = cached !== null;
- if (isCached) {
- var data = JSON.parse(cached);
- update(container, data.content);
- }
- }
+ document.body.insertAdjacentElement('afterbegin', container);
+ }; // Only load once if ID set
- // Get the sprite
- fetch(url).then(function (result) {
- if (is.empty(result)) {
- return;
- }
- if (useStorage) {
- window.localStorage.setItem(prefix + '-' + id, JSON.stringify({
- content: result
- }));
- }
+ if (!hasId || !exists()) {
+ var useStorage = Storage.supported; // Create container
- update(container, result);
- }).catch(function () {});
- }
- }
+ var container = document.createElement('div');
+ container.setAttribute('hidden', '');
- // ==========================================================================
+ if (hasId) {
+ container.setAttribute('id', id);
+ } // Check in cache
- // Time helpers
- var getHours = function getHours(value) {
- return parseInt(value / 60 / 60 % 60, 10);
- };
- var getMinutes = function getMinutes(value) {
- return parseInt(value / 60 % 60, 10);
- };
- var getSeconds = function getSeconds(value) {
- return parseInt(value % 60, 10);
- };
- // Format time to UI friendly string
- function formatTime() {
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ if (useStorage) {
+ var cached = window.localStorage.getItem("".concat(prefix, "-").concat(id));
+ isCached = cached !== null;
- // Bail if the value isn't a number
- if (!is.number(time)) {
- return formatTime(null, displayHours, inverted);
+ if (isCached) {
+ var data = JSON.parse(cached);
+ update(container, data.content);
}
+ } // Get the sprite
- // Format time component to add leading zero
- var format = function format(value) {
- return ('0' + value).slice(-2);
- };
- // Breakdown to hours, mins, secs
- var hours = getHours(time);
- var mins = getMinutes(time);
- var secs = getSeconds(time);
+ fetch(url).then(function (result) {
+ if (is.empty(result)) {
+ return;
+ }
- // Do we need to display hours?
- if (displayHours || hours > 0) {
- hours = hours + ':';
- } else {
- hours = '';
+ if (useStorage) {
+ window.localStorage.setItem("".concat(prefix, "-").concat(id), JSON.stringify({
+ content: result
+ }));
}
- // Render
- return '' + (inverted && time > 0 ? '-' : '') + hours + format(mins) + ':' + format(secs);
+ update(container, result);
+ }).catch(function () {});
}
+ }
+
+ // ==========================================================================
+
+ var getHours = function getHours(value) {
+ return parseInt(value / 60 / 60 % 60, 10);
+ };
+ var getMinutes = function getMinutes(value) {
+ return parseInt(value / 60 % 60, 10);
+ };
+ var getSeconds = function getSeconds(value) {
+ return parseInt(value % 60, 10);
+ }; // Format time to UI friendly string
+
+ function formatTime() {
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ // Bail if the value isn't a number
+ if (!is.number(time)) {
+ return formatTime(null, displayHours, inverted);
+ } // Format time component to add leading zero
+
+
+ var format = function format(value) {
+ return "0".concat(value).slice(-2);
+ }; // Breakdown to hours, mins, secs
+
+
+ var hours = getHours(time);
+ var mins = getMinutes(time);
+ var secs = getSeconds(time); // Do we need to display hours?
+
+ if (displayHours || hours > 0) {
+ hours = "".concat(hours, ":");
+ } else {
+ hours = '';
+ } // Render
+
+
+ return "".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), ":").concat(format(secs));
+ }
+
+ var controls = {
+ // Get icon URL
+ getIconUrl: function getIconUrl() {
+ var url = new URL(this.config.iconUrl, window.location);
+ var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
+ return {
+ url: this.config.iconUrl,
+ cors: cors
+ };
+ },
+ // Find the UI controls
+ findElements: function findElements() {
+ try {
+ this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons
+
+ this.elements.buttons = {
+ play: getElements.call(this, this.config.selectors.buttons.play),
+ pause: getElement.call(this, this.config.selectors.buttons.pause),
+ restart: getElement.call(this, this.config.selectors.buttons.restart),
+ rewind: getElement.call(this, this.config.selectors.buttons.rewind),
+ fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
+ mute: getElement.call(this, this.config.selectors.buttons.mute),
+ pip: getElement.call(this, this.config.selectors.buttons.pip),
+ airplay: getElement.call(this, this.config.selectors.buttons.airplay),
+ settings: getElement.call(this, this.config.selectors.buttons.settings),
+ captions: getElement.call(this, this.config.selectors.buttons.captions),
+ fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)
+ }; // Progress
+
+ this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs
+
+ this.elements.inputs = {
+ seek: getElement.call(this, this.config.selectors.inputs.seek),
+ volume: getElement.call(this, this.config.selectors.inputs.volume)
+ }; // Display
+
+ this.elements.display = {
+ buffer: getElement.call(this, this.config.selectors.display.buffer),
+ currentTime: getElement.call(this, this.config.selectors.display.currentTime),
+ duration: getElement.call(this, this.config.selectors.display.duration)
+ }; // Seek tooltip
+
+ if (is.element(this.elements.progress)) {
+ this.elements.display.seekTooltip = this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip));
+ }
- // ==========================================================================
-
- // TODO: Don't export a massive object - break down and create class
- var controls = {
- // Get icon URL
- getIconUrl: function getIconUrl() {
- var url = new URL(this.config.iconUrl, window.location);
- var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
-
- return {
- url: this.config.iconUrl,
- cors: cors
- };
- },
-
-
- // Find the UI controls
- findElements: function findElements() {
- try {
- this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);
-
- // Buttons
- this.elements.buttons = {
- play: getElements.call(this, this.config.selectors.buttons.play),
- pause: getElement.call(this, this.config.selectors.buttons.pause),
- restart: getElement.call(this, this.config.selectors.buttons.restart),
- rewind: getElement.call(this, this.config.selectors.buttons.rewind),
- fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
- mute: getElement.call(this, this.config.selectors.buttons.mute),
- pip: getElement.call(this, this.config.selectors.buttons.pip),
- airplay: getElement.call(this, this.config.selectors.buttons.airplay),
- settings: getElement.call(this, this.config.selectors.buttons.settings),
- captions: getElement.call(this, this.config.selectors.buttons.captions),
- fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)
- };
-
- // Progress
- this.elements.progress = getElement.call(this, this.config.selectors.progress);
-
- // Inputs
- this.elements.inputs = {
- seek: getElement.call(this, this.config.selectors.inputs.seek),
- volume: getElement.call(this, this.config.selectors.inputs.volume)
- };
-
- // Display
- this.elements.display = {
- buffer: getElement.call(this, this.config.selectors.display.buffer),
- currentTime: getElement.call(this, this.config.selectors.display.currentTime),
- duration: getElement.call(this, this.config.selectors.display.duration)
- };
-
- // Seek tooltip
- if (is.element(this.elements.progress)) {
- this.elements.display.seekTooltip = this.elements.progress.querySelector('.' + this.config.classNames.tooltip);
- }
-
- return true;
- } catch (error) {
- // Log it
- this.debug.warn('It looks like there is a problem with your custom controls HTML', error);
-
- // Restore native video controls
- this.toggleNativeControls(true);
-
- return false;
- }
- },
-
-
- // Create <svg> icon
- createIcon: function createIcon(type, attributes) {
- var namespace = 'http://www.w3.org/2000/svg';
- var iconUrl = controls.getIconUrl.call(this);
- var iconPath = (!iconUrl.cors ? iconUrl.url : '') + '#' + this.config.iconPrefix;
-
- // Create <svg>
- var icon = document.createElementNS(namespace, 'svg');
- setAttributes(icon, extend(attributes, {
- role: 'presentation',
- focusable: 'false'
- }));
-
- // Create the <use> to reference sprite
- var use = document.createElementNS(namespace, 'use');
- var path = iconPath + '-' + type;
-
- // Set `href` attributes
- // https://github.com/sampotts/plyr/issues/460
- // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
- if ('href' in use) {
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
- } else {
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);
- }
-
- // Add <use> to <svg>
- icon.appendChild(use);
-
- return icon;
- },
-
-
- // Create hidden text label
- createLabel: function createLabel(type) {
- var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
- // Skip i18n for abbreviations and brand names
- var universals = {
- pip: 'PIP',
- airplay: 'AirPlay'
- };
- var text = universals[type] || i18n.get(type, this.config);
-
- var attributes = Object.assign({}, attr, {
- class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')
- });
- return createElement('span', attributes, text);
- },
-
-
- // Create a badge
- createBadge: function createBadge(text) {
- if (is.empty(text)) {
- return null;
- }
-
- var badge = createElement('span', {
- class: this.config.classNames.menu.value
- });
+ return true;
+ } catch (error) {
+ // Log it
+ this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls
- badge.appendChild(createElement('span', {
- class: this.config.classNames.menu.badge
- }, text));
+ this.toggleNativeControls(true);
+ return false;
+ }
+ },
+ // Create <svg> icon
+ createIcon: function createIcon(type, attributes) {
+ var namespace = 'http://www.w3.org/2000/svg';
+ var iconUrl = controls.getIconUrl.call(this);
+ var iconPath = "".concat(!iconUrl.cors ? iconUrl.url : '', "#").concat(this.config.iconPrefix); // Create <svg>
+
+ var icon = document.createElementNS(namespace, 'svg');
+ setAttributes(icon, extend(attributes, {
+ role: 'presentation',
+ focusable: 'false'
+ })); // Create the <use> to reference sprite
+
+ var use = document.createElementNS(namespace, 'use');
+ var path = "".concat(iconPath, "-").concat(type); // Set `href` attributes
+ // https://github.com/sampotts/plyr/issues/460
+ // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
+
+ if ('href' in use) {
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
+ } else {
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);
+ } // Add <use> to <svg>
+
+
+ icon.appendChild(use);
+ return icon;
+ },
+ // Create hidden text label
+ createLabel: function createLabel(type) {
+ var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ // Skip i18n for abbreviations and brand names
+ var universals = {
+ pip: 'PIP',
+ airplay: 'AirPlay'
+ };
+ var text = universals[type] || i18n.get(type, this.config);
+ var attributes = Object.assign({}, attr, {
+ class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')
+ });
+ return createElement('span', attributes, text);
+ },
+ // Create a badge
+ createBadge: function createBadge(text) {
+ if (is.empty(text)) {
+ return null;
+ }
- return badge;
- },
+ var badge = createElement('span', {
+ class: this.config.classNames.menu.value
+ });
+ badge.appendChild(createElement('span', {
+ class: this.config.classNames.menu.badge
+ }, text));
+ return badge;
+ },
+ // Create a <button>
+ createButton: function createButton(buttonType, attr) {
+ var button = createElement('button');
+ var attributes = Object.assign({}, attr);
+ var type = toCamelCase(buttonType);
+ var toggle = false;
+ var label;
+ var icon;
+ var labelPressed;
+ var iconPressed;
+
+ if (!('type' in attributes)) {
+ attributes.type = 'button';
+ }
+ if ('class' in attributes) {
+ if (!attributes.class.includes(this.config.classNames.control)) {
+ attributes.class += " ".concat(this.config.classNames.control);
+ }
+ } else {
+ attributes.class = this.config.classNames.control;
+ } // Large play button
+
+
+ switch (buttonType) {
+ case 'play':
+ toggle = true;
+ label = 'play';
+ labelPressed = 'pause';
+ icon = 'play';
+ iconPressed = 'pause';
+ break;
+
+ case 'mute':
+ toggle = true;
+ label = 'mute';
+ labelPressed = 'unmute';
+ icon = 'volume';
+ iconPressed = 'muted';
+ break;
+
+ case 'captions':
+ toggle = true;
+ label = 'enableCaptions';
+ labelPressed = 'disableCaptions';
+ icon = 'captions-off';
+ iconPressed = 'captions-on';
+ break;
+
+ case 'fullscreen':
+ toggle = true;
+ label = 'enterFullscreen';
+ labelPressed = 'exitFullscreen';
+ icon = 'enter-fullscreen';
+ iconPressed = 'exit-fullscreen';
+ break;
+
+ case 'play-large':
+ attributes.class += " ".concat(this.config.classNames.control, "--overlaid");
+ type = 'play';
+ label = 'play';
+ icon = 'play';
+ break;
+
+ default:
+ label = type;
+ icon = buttonType;
+ } // Setup toggle icon and labels
+
+
+ if (toggle) {
+ // Icon
+ button.appendChild(controls.createIcon.call(this, iconPressed, {
+ class: 'icon--pressed'
+ }));
+ button.appendChild(controls.createIcon.call(this, icon, {
+ class: 'icon--not-pressed'
+ })); // Label/Tooltip
+
+ button.appendChild(controls.createLabel.call(this, labelPressed, {
+ class: 'label--pressed'
+ }));
+ button.appendChild(controls.createLabel.call(this, label, {
+ class: 'label--not-pressed'
+ }));
+ } else {
+ button.appendChild(controls.createIcon.call(this, icon));
+ button.appendChild(controls.createLabel.call(this, label));
+ } // Merge attributes
- // Create a <button>
- createButton: function createButton(buttonType, attr) {
- var button = createElement('button');
- var attributes = Object.assign({}, attr);
- var type = toCamelCase(buttonType);
- var toggle = false;
- var label = void 0;
- var icon = void 0;
- var labelPressed = void 0;
- var iconPressed = void 0;
+ extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
+ setAttributes(button, attributes); // We have multiple play buttons
- if (!('type' in attributes)) {
- attributes.type = 'button';
- }
+ if (type === 'play') {
+ if (!is.array(this.elements.buttons[type])) {
+ this.elements.buttons[type] = [];
+ }
- if ('class' in attributes) {
- if (!attributes.class.includes(this.config.classNames.control)) {
- attributes.class += ' ' + this.config.classNames.control;
- }
- } else {
- attributes.class = this.config.classNames.control;
- }
+ this.elements.buttons[type].push(button);
+ } else {
+ this.elements.buttons[type] = button;
+ }
- // Large play button
- switch (buttonType) {
- case 'play':
- toggle = true;
- label = 'play';
- labelPressed = 'pause';
- icon = 'play';
- iconPressed = 'pause';
- break;
-
- case 'mute':
- toggle = true;
- label = 'mute';
- labelPressed = 'unmute';
- icon = 'volume';
- iconPressed = 'muted';
- break;
-
- case 'captions':
- toggle = true;
- label = 'enableCaptions';
- labelPressed = 'disableCaptions';
- icon = 'captions-off';
- iconPressed = 'captions-on';
- break;
-
- case 'fullscreen':
- toggle = true;
- label = 'enterFullscreen';
- labelPressed = 'exitFullscreen';
- icon = 'enter-fullscreen';
- iconPressed = 'exit-fullscreen';
- break;
-
- case 'play-large':
- attributes.class += ' ' + this.config.classNames.control + '--overlaid';
- toggle = true;
- type = 'play';
- label = 'play';
- labelPressed = 'pause';
- icon = 'play';
- iconPressed = 'pause';
- break;
-
- default:
- label = type;
- icon = buttonType;
- }
+ return button;
+ },
+ // Create an <input type='range'>
+ createRange: function createRange(type, attributes) {
+ // Seek input
+ var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
+ type: 'range',
+ min: 0,
+ max: 100,
+ step: 0.01,
+ value: 0,
+ autocomplete: 'off',
+ // A11y fixes for https://github.com/sampotts/plyr/issues/905
+ role: 'slider',
+ 'aria-label': i18n.get(type, this.config),
+ 'aria-valuemin': 0,
+ 'aria-valuemax': 100,
+ 'aria-valuenow': 0
+ }, attributes));
+ this.elements.inputs[type] = input; // Set the fill for webkit now
+
+ controls.updateRangeFill.call(this, input);
+ return input;
+ },
+ // Create a <progress>
+ createProgress: function createProgress(type, attributes) {
+ var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {
+ min: 0,
+ max: 100,
+ value: 0,
+ role: 'presentation',
+ 'aria-hidden': true
+ }, attributes)); // Create the label inside
+
+ if (type !== 'volume') {
+ progress.appendChild(createElement('span', null, '0'));
+ var suffixKey = {
+ played: 'played',
+ buffer: 'buffered'
+ }[type];
+ var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
+ progress.innerText = "% ".concat(suffix.toLowerCase());
+ }
- // Setup toggle icon and labels
- if (toggle) {
- // Icon
- button.appendChild(controls.createIcon.call(this, iconPressed, {
- class: 'icon--pressed'
- }));
- button.appendChild(controls.createIcon.call(this, icon, {
- class: 'icon--not-pressed'
- }));
-
- // Label/Tooltip
- button.appendChild(controls.createLabel.call(this, labelPressed, {
- class: 'label--pressed'
- }));
- button.appendChild(controls.createLabel.call(this, label, {
- class: 'label--not-pressed'
- }));
- } else {
- button.appendChild(controls.createIcon.call(this, icon));
- button.appendChild(controls.createLabel.call(this, label));
- }
+ this.elements.display[type] = progress;
+ return progress;
+ },
+ // Create time display
+ createTime: function createTime(type) {
+ var attributes = getAttributesFromSelector(this.config.selectors.display[type]);
+ var container = createElement('div', extend(attributes, {
+ class: "".concat(this.config.classNames.display.time, " ").concat(attributes.class ? attributes.class : '').trim(),
+ 'aria-label': i18n.get(type, this.config)
+ }), '00:00'); // Reference for updates
+
+ this.elements.display[type] = container;
+ return container;
+ },
+ // Bind keyboard shortcuts for a menu item
+ // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
+ bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {
+ var _this = this;
+
+ // Navigate through menus via arrow keys and space
+ on(menuItem, 'keydown keyup', function (event) {
+ // We only care about space and ⬆️ ⬇️️ ➡️
+ if (![32, 38, 39, 40].includes(event.which)) {
+ return;
+ } // Prevent play / seek
+
+
+ event.preventDefault();
+ event.stopPropagation(); // We're just here to prevent the keydown bubbling
+
+ if (event.type === 'keydown') {
+ return;
+ }
- // Merge attributes
- extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
+ var isRadioButton = matches(menuItem, '[role="menuitemradio"]'); // Show the respective menu
- setAttributes(button, attributes);
+ if (!isRadioButton && [32, 39].includes(event.which)) {
+ controls.showMenuPanel.call(_this, type, true);
+ } else {
+ var target;
- // We have multiple play buttons
- if (type === 'play') {
- if (!is.array(this.elements.buttons[type])) {
- this.elements.buttons[type] = [];
- }
+ if (event.which !== 32) {
+ if (event.which === 40 || isRadioButton && event.which === 39) {
+ target = menuItem.nextElementSibling;
- this.elements.buttons[type].push(button);
+ if (!is.element(target)) {
+ target = menuItem.parentNode.firstElementChild;
+ }
} else {
- this.elements.buttons[type] = button;
- }
-
- return button;
- },
-
-
- // Create an <input type='range'>
- createRange: function createRange(type, attributes) {
- // Seek input
- var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
- type: 'range',
- min: 0,
- max: 100,
- step: 0.01,
- value: 0,
- autocomplete: 'off',
- // A11y fixes for https://github.com/sampotts/plyr/issues/905
- role: 'slider',
- 'aria-label': i18n.get(type, this.config),
- 'aria-valuemin': 0,
- 'aria-valuemax': 100,
- 'aria-valuenow': 0
- }, attributes));
-
- this.elements.inputs[type] = input;
-
- // Set the fill for webkit now
- controls.updateRangeFill.call(this, input);
-
- return input;
- },
-
-
- // Create a <progress>
- createProgress: function createProgress(type, attributes) {
- var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {
- min: 0,
- max: 100,
- value: 0,
- role: 'presentation',
- 'aria-hidden': true
- }, attributes));
-
- // Create the label inside
- if (type !== 'volume') {
- progress.appendChild(createElement('span', null, '0'));
-
- var suffixKey = {
- played: 'played',
- buffer: 'buffered'
- }[type];
- var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
+ target = menuItem.previousElementSibling;
- progress.innerText = '% ' + suffix.toLowerCase();
+ if (!is.element(target)) {
+ target = menuItem.parentNode.lastElementChild;
+ }
}
- this.elements.display[type] = progress;
-
- return progress;
- },
-
-
- // Create time display
- createTime: function createTime(type) {
- var attributes = getAttributesFromSelector(this.config.selectors.display[type]);
-
- var container = createElement('div', extend(attributes, {
- class: (this.config.classNames.display.time + ' ' + (attributes.class ? attributes.class : '')).trim(),
- 'aria-label': i18n.get(type, this.config)
- }), '00:00');
-
- // Reference for updates
- this.elements.display[type] = container;
-
- return container;
- },
-
-
- // Bind keyboard shortcuts for a menu item
- // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
- bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {
- var _this = this;
-
- // Navigate through menus via arrow keys and space
- on(menuItem, 'keydown keyup', function (event) {
- // We only care about space and ⬆️ ⬇️️ ➡️
- if (![32, 38, 39, 40].includes(event.which)) {
- return;
- }
-
- // Prevent play / seek
- event.preventDefault();
- event.stopPropagation();
-
- // We're just here to prevent the keydown bubbling
- if (event.type === 'keydown') {
- return;
- }
-
- var isRadioButton = matches(menuItem, '[role="menuitemradio"]');
-
- // Show the respective menu
- if (!isRadioButton && [32, 39].includes(event.which)) {
- controls.showMenuPanel.call(_this, type, true);
- } else {
- var target = void 0;
-
- if (event.which !== 32) {
- if (event.which === 40 || isRadioButton && event.which === 39) {
- target = menuItem.nextElementSibling;
-
- if (!is.element(target)) {
- target = menuItem.parentNode.firstElementChild;
- }
- } else {
- target = menuItem.previousElementSibling;
+ setFocus.call(_this, target, true);
+ }
+ }
+ }, false); // Enter will fire a `click` event but we still need to manage focus
+ // So we bind to keyup which fires after and set focus here
- if (!is.element(target)) {
- target = menuItem.parentNode.lastElementChild;
- }
- }
+ on(menuItem, 'keyup', function (event) {
+ if (event.which !== 13) {
+ return;
+ }
- setFocus.call(_this, target, true);
- }
- }
- }, false);
+ controls.focusFirstMenuItem.call(_this, null, true);
+ });
+ },
+ // Create a settings menu item
+ createMenuItem: function createMenuItem(_ref) {
+ var _this2 = this;
+
+ var value = _ref.value,
+ list = _ref.list,
+ type = _ref.type,
+ title = _ref.title,
+ _ref$badge = _ref.badge,
+ badge = _ref$badge === void 0 ? null : _ref$badge,
+ _ref$checked = _ref.checked,
+ checked = _ref$checked === void 0 ? false : _ref$checked;
+ var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);
+ var menuItem = createElement('button', extend(attributes, {
+ type: 'button',
+ role: 'menuitemradio',
+ class: "".concat(this.config.classNames.control, " ").concat(attributes.class ? attributes.class : '').trim(),
+ 'aria-checked': checked,
+ value: value
+ }));
+ var flex = createElement('span'); // We have to set as HTML incase of special characters
+
+ flex.innerHTML = title;
+
+ if (is.element(badge)) {
+ flex.appendChild(badge);
+ }
- // Enter will fire a `click` event but we still need to manage focus
- // So we bind to keyup which fires after and set focus here
- on(menuItem, 'keyup', function (event) {
- if (event.which !== 13) {
- return;
- }
+ menuItem.appendChild(flex); // Replicate radio button behaviour
- controls.focusFirstMenuItem.call(_this, null, true);
- });
+ Object.defineProperty(menuItem, 'checked', {
+ enumerable: true,
+ get: function get() {
+ return menuItem.getAttribute('aria-checked') === 'true';
},
-
-
- // Create a settings menu item
- createMenuItem: function createMenuItem(_ref) {
- var _this2 = this;
-
- var value = _ref.value,
- list = _ref.list,
- type = _ref.type,
- title = _ref.title,
- _ref$badge = _ref.badge,
- badge = _ref$badge === undefined ? null : _ref$badge,
- _ref$checked = _ref.checked,
- checked = _ref$checked === undefined ? false : _ref$checked;
-
- var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);
-
- var menuItem = createElement('button', extend(attributes, {
- type: 'button',
- role: 'menuitemradio',
- class: (this.config.classNames.control + ' ' + (attributes.class ? attributes.class : '')).trim(),
- 'aria-checked': checked,
- value: value
- }));
-
- var flex = createElement('span');
-
- // We have to set as HTML incase of special characters
- flex.innerHTML = title;
-
- if (is.element(badge)) {
- flex.appendChild(badge);
- }
-
- menuItem.appendChild(flex);
-
- // Replicate radio button behaviour
- Object.defineProperty(menuItem, 'checked', {
- enumerable: true,
- get: function get$$1() {
- return menuItem.getAttribute('aria-checked') === 'true';
- },
- set: function set$$1(checked) {
- // Ensure exclusivity
- if (checked) {
- Array.from(menuItem.parentNode.children).filter(function (node) {
- return matches(node, '[role="menuitemradio"]');
- }).forEach(function (node) {
- return node.setAttribute('aria-checked', 'false');
- });
- }
-
- menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');
- }
+ set: function set(checked) {
+ // Ensure exclusivity
+ if (checked) {
+ Array.from(menuItem.parentNode.children).filter(function (node) {
+ return matches(node, '[role="menuitemradio"]');
+ }).forEach(function (node) {
+ return node.setAttribute('aria-checked', 'false');
});
+ }
- this.listeners.bind(menuItem, 'click keyup', function (event) {
- if (is.keyboardEvent(event) && event.which !== 32) {
- return;
- }
-
- event.preventDefault();
- event.stopPropagation();
-
- menuItem.checked = true;
-
- switch (type) {
- case 'language':
- _this2.currentTrack = Number(value);
- break;
-
- case 'quality':
- _this2.quality = value;
- break;
-
- case 'speed':
- _this2.speed = parseFloat(value);
- break;
-
- default:
- break;
- }
-
- controls.showMenuPanel.call(_this2, 'home', is.keyboardEvent(event));
- }, type, false);
-
- controls.bindMenuItemShortcuts.call(this, menuItem, type);
-
- list.appendChild(menuItem);
- },
-
-
- // Format a time for display
- formatTime: function formatTime$$1() {
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- // Bail if the value isn't a number
- if (!is.number(time)) {
- return time;
- }
-
- // Always display hours if duration is over an hour
- var forceHours = getHours(this.duration) > 0;
-
- return formatTime(time, forceHours, inverted);
- },
-
-
- // Update the displayed time
- updateTimeDisplay: function updateTimeDisplay() {
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
- // Bail if there's no element to display or the value isn't a number
- if (!is.element(target) || !is.number(time)) {
- return;
- }
-
- // eslint-disable-next-line no-param-reassign
- target.innerText = controls.formatTime(time, inverted);
- },
-
-
- // Update volume UI and storage
- updateVolume: function updateVolume() {
- if (!this.supported.ui) {
- return;
- }
-
- // Update range
- if (is.element(this.elements.inputs.volume)) {
- controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
- }
-
- // Update mute state
- if (is.element(this.elements.buttons.mute)) {
- this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
- }
- },
-
-
- // Update seek value and lower fill
- setRange: function setRange(target) {
- var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
-
- if (!is.element(target)) {
- return;
- }
-
- // eslint-disable-next-line
- target.value = value;
-
- // Webkit range fill
- controls.updateRangeFill.call(this, target);
- },
+ menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');
+ }
+ });
+ this.listeners.bind(menuItem, 'click keyup', function (event) {
+ if (is.keyboardEvent(event) && event.which !== 32) {
+ return;
+ }
+ event.preventDefault();
+ event.stopPropagation();
+ menuItem.checked = true;
- // Update <progress> elements
- updateProgress: function updateProgress(event) {
- var _this3 = this;
+ switch (type) {
+ case 'language':
+ _this2.currentTrack = Number(value);
+ break;
- if (!this.supported.ui || !is.event(event)) {
- return;
- }
+ case 'quality':
+ _this2.quality = value;
+ break;
- var value = 0;
+ case 'speed':
+ _this2.speed = parseFloat(value);
+ break;
- var setProgress = function setProgress(target, input) {
- var value = is.number(input) ? input : 0;
- var progress = is.element(target) ? target : _this3.elements.display.buffer;
+ default:
+ break;
+ }
- // Update value and label
- if (is.element(progress)) {
- progress.value = value;
+ controls.showMenuPanel.call(_this2, 'home', is.keyboardEvent(event));
+ }, type, false);
+ controls.bindMenuItemShortcuts.call(this, menuItem, type);
+ list.appendChild(menuItem);
+ },
+ // Format a time for display
+ formatTime: function formatTime$$1() {
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ // Bail if the value isn't a number
+ if (!is.number(time)) {
+ return time;
+ } // Always display hours if duration is over an hour
+
+
+ var forceHours = getHours(this.duration) > 0;
+ return formatTime(time, forceHours, inverted);
+ },
+ // Update the displayed time
+ updateTimeDisplay: function updateTimeDisplay() {
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ // Bail if there's no element to display or the value isn't a number
+ if (!is.element(target) || !is.number(time)) {
+ return;
+ } // eslint-disable-next-line no-param-reassign
+
+
+ target.innerText = controls.formatTime(time, inverted);
+ },
+ // Update volume UI and storage
+ updateVolume: function updateVolume() {
+ if (!this.supported.ui) {
+ return;
+ } // Update range
+
+
+ if (is.element(this.elements.inputs.volume)) {
+ controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
+ } // Update mute state
+
+
+ if (is.element(this.elements.buttons.mute)) {
+ this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
+ }
+ },
+ // Update seek value and lower fill
+ setRange: function setRange(target) {
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- // Update text label inside
- var label = progress.getElementsByTagName('span')[0];
- if (is.element(label)) {
- label.childNodes[0].nodeValue = value;
- }
- }
- };
+ if (!is.element(target)) {
+ return;
+ } // eslint-disable-next-line
- if (event) {
- switch (event.type) {
- // Video playing
- case 'timeupdate':
- case 'seeking':
- case 'seeked':
- value = getPercentage(this.currentTime, this.duration);
- // Set seek range value only if it's a 'natural' time event
- if (event.type === 'timeupdate') {
- controls.setRange.call(this, this.elements.inputs.seek, value);
- }
+ target.value = value; // Webkit range fill
- break;
+ controls.updateRangeFill.call(this, target);
+ },
+ // Update <progress> elements
+ updateProgress: function updateProgress(event) {
+ var _this3 = this;
- // Check buffer status
- case 'playing':
- case 'progress':
- setProgress(this.elements.display.buffer, this.buffered * 100);
+ if (!this.supported.ui || !is.event(event)) {
+ return;
+ }
- break;
+ var value = 0;
- default:
- break;
- }
- }
- },
+ var setProgress = function setProgress(target, input) {
+ var value = is.number(input) ? input : 0;
+ var progress = is.element(target) ? target : _this3.elements.display.buffer; // Update value and label
+ if (is.element(progress)) {
+ progress.value = value; // Update text label inside
- // Webkit polyfill for lower fill range
- updateRangeFill: function updateRangeFill(target) {
- // Get range from event if event passed
- var range = is.event(target) ? target.target : target;
+ var label = progress.getElementsByTagName('span')[0];
- // Needs to be a valid <input type='range'>
- if (!is.element(range) || range.getAttribute('type') !== 'range') {
- return;
- }
+ if (is.element(label)) {
+ label.childNodes[0].nodeValue = value;
+ }
+ }
+ };
- // Set aria values for https://github.com/sampotts/plyr/issues/905
- if (matches(range, this.config.selectors.inputs.seek)) {
- range.setAttribute('aria-valuenow', this.currentTime);
- var currentTime = controls.formatTime(this.currentTime);
- var duration = controls.formatTime(this.duration);
- var format$$1 = i18n.get('seekLabel', this.config);
- range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
- } else if (matches(range, this.config.selectors.inputs.volume)) {
- var percent = range.value * 100;
- range.setAttribute('aria-valuenow', percent);
- range.setAttribute('aria-valuetext', percent.toFixed(1) + '%');
- } else {
- range.setAttribute('aria-valuenow', range.value);
- }
+ if (event) {
+ switch (event.type) {
+ // Video playing
+ case 'timeupdate':
+ case 'seeking':
+ case 'seeked':
+ value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event
- // WebKit only
- if (!browser.isWebkit) {
- return;
+ if (event.type === 'timeupdate') {
+ controls.setRange.call(this, this.elements.inputs.seek, value);
}
- // Set CSS custom property
- range.style.setProperty('--value', range.value / range.max * 100 + '%');
- },
-
+ break;
+ // Check buffer status
- // Update hover tooltip for seeking
- updateSeekTooltip: function updateSeekTooltip(event) {
- var _this4 = this;
+ case 'playing':
+ case 'progress':
+ setProgress(this.elements.display.buffer, this.buffered * 100);
+ break;
- // Bail if setting not true
- if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {
- return;
- }
-
- // Calculate percentage
- var percent = 0;
- var clientRect = this.elements.progress.getBoundingClientRect();
- var visible = this.config.classNames.tooltip + '--visible';
-
- var toggle = function toggle(_toggle) {
- toggleClass(_this4.elements.display.seekTooltip, visible, _toggle);
- };
+ default:
+ break;
+ }
+ }
+ },
+ // Webkit polyfill for lower fill range
+ updateRangeFill: function updateRangeFill(target) {
+ // Get range from event if event passed
+ var range = is.event(target) ? target.target : target; // Needs to be a valid <input type='range'>
+
+ if (!is.element(range) || range.getAttribute('type') !== 'range') {
+ return;
+ } // Set aria values for https://github.com/sampotts/plyr/issues/905
+
+
+ if (matches(range, this.config.selectors.inputs.seek)) {
+ range.setAttribute('aria-valuenow', this.currentTime);
+ var currentTime = controls.formatTime(this.currentTime);
+ var duration = controls.formatTime(this.duration);
+ var format$$1 = i18n.get('seekLabel', this.config);
+ range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
+ } else if (matches(range, this.config.selectors.inputs.volume)) {
+ var percent = range.value * 100;
+ range.setAttribute('aria-valuenow', percent);
+ range.setAttribute('aria-valuetext', "".concat(percent.toFixed(1), "%"));
+ } else {
+ range.setAttribute('aria-valuenow', range.value);
+ } // WebKit only
- // Hide on touch
- if (this.touch) {
- toggle(false);
- return;
- }
- // Determine percentage, if already visible
- if (is.event(event)) {
- percent = 100 / clientRect.width * (event.pageX - clientRect.left);
- } else if (hasClass(this.elements.display.seekTooltip, visible)) {
- percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
- } else {
- return;
- }
+ if (!browser.isWebkit) {
+ return;
+ } // Set CSS custom property
- // Set bounds
- if (percent < 0) {
- percent = 0;
- } else if (percent > 100) {
- percent = 100;
- }
- // Display the time a click would seek to
- controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);
+ range.style.setProperty('--value', "".concat(range.value / range.max * 100, "%"));
+ },
+ // Update hover tooltip for seeking
+ updateSeekTooltip: function updateSeekTooltip(event) {
+ var _this4 = this;
- // Set position
- this.elements.display.seekTooltip.style.left = percent + '%';
+ // Bail if setting not true
+ if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {
+ return;
+ } // Calculate percentage
- // Show/hide the tooltip
- // If the event is a moues in/out and percentage is inside bounds
- if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
- toggle(event.type === 'mouseenter');
- }
- },
+ var percent = 0;
+ var clientRect = this.elements.progress.getBoundingClientRect();
+ var visible = "".concat(this.config.classNames.tooltip, "--visible");
- // Handle time change event
- timeUpdate: function timeUpdate(event) {
- // Only invert if only one time element is displayed and used for both duration and currentTime
- var invert = !is.element(this.elements.display.duration) && this.config.invertTime;
+ var toggle = function toggle(_toggle) {
+ toggleClass(_this4.elements.display.seekTooltip, visible, _toggle);
+ }; // Hide on touch
- // Duration
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);
- // Ignore updates while seeking
- if (event && event.type === 'timeupdate' && this.media.seeking) {
- return;
- }
+ if (this.touch) {
+ toggle(false);
+ return;
+ } // Determine percentage, if already visible
- // Playing progress
- controls.updateProgress.call(this, event);
- },
+ if (is.event(event)) {
+ percent = 100 / clientRect.width * (event.pageX - clientRect.left);
+ } else if (hasClass(this.elements.display.seekTooltip, visible)) {
+ percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
+ } else {
+ return;
+ } // Set bounds
- // Show the duration on metadataloaded or durationchange events
- durationUpdate: function durationUpdate() {
- // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
- if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
- return;
- }
- // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.
- // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415
- // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062
- // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338
- if (this.duration >= Math.pow(2, 32)) {
- toggleHidden(this.elements.display.currentTime, true);
- toggleHidden(this.elements.progress, true);
- return;
- }
+ if (percent < 0) {
+ percent = 0;
+ } else if (percent > 100) {
+ percent = 100;
+ } // Display the time a click would seek to
- // Update ARIA values
- if (is.element(this.elements.inputs.seek)) {
- this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
- }
- // If there's a spot to display duration
- var hasDuration = is.element(this.elements.display.duration);
+ controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position
- // If there's only one time display, display duration there
- if (!hasDuration && this.config.displayDuration && this.paused) {
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
- }
+ this.elements.display.seekTooltip.style.left = "".concat(percent, "%"); // Show/hide the tooltip
+ // If the event is a moues in/out and percentage is inside bounds
- // If there's a duration element, update content
- if (hasDuration) {
- controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
- }
+ if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
+ toggle(event.type === 'mouseenter');
+ }
+ },
+ // Handle time change event
+ timeUpdate: function timeUpdate(event) {
+ // Only invert if only one time element is displayed and used for both duration and currentTime
+ var invert = !is.element(this.elements.display.duration) && this.config.invertTime; // Duration
- // Update the tooltip (if visible)
- controls.updateSeekTooltip.call(this);
- },
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking
+ if (event && event.type === 'timeupdate' && this.media.seeking) {
+ return;
+ } // Playing progress
- // Hide/show a tab
- toggleMenuButton: function toggleMenuButton(setting, toggle) {
- toggleHidden(this.elements.settings.buttons[setting], !toggle);
- },
+ controls.updateProgress.call(this, event);
+ },
+ // Show the duration on metadataloaded or durationchange events
+ durationUpdate: function durationUpdate() {
+ // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
+ if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
+ return;
+ } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.
+ // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415
+ // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062
+ // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338
- // Update the selected setting
- updateSetting: function updateSetting(setting, container, input) {
- var pane = this.elements.settings.panels[setting];
- var value = null;
- var list = container;
- if (setting === 'captions') {
- value = this.currentTrack;
- } else {
- value = !is.empty(input) ? input : this[setting];
+ if (this.duration >= Math.pow(2, 32)) {
+ toggleHidden(this.elements.display.currentTime, true);
+ toggleHidden(this.elements.progress, true);
+ return;
+ } // Update ARIA values
- // Get default
- if (is.empty(value)) {
- value = this.config[setting].default;
- }
- // Unsupported value
- if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {
- this.debug.warn('Unsupported value of \'' + value + '\' for ' + setting);
- return;
- }
+ if (is.element(this.elements.inputs.seek)) {
+ this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
+ } // If there's a spot to display duration
- // Disabled value
- if (!this.config[setting].options.includes(value)) {
- this.debug.warn('Disabled value of \'' + value + '\' for ' + setting);
- return;
- }
- }
- // Get the list if we need to
- if (!is.element(list)) {
- list = pane && pane.querySelector('[role="menu"]');
- }
+ var hasDuration = is.element(this.elements.display.duration); // If there's only one time display, display duration there
- // If there's no list it means it's not been rendered...
- if (!is.element(list)) {
- return;
- }
+ if (!hasDuration && this.config.displayDuration && this.paused) {
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
+ } // If there's a duration element, update content
- // Update the label
- var label = this.elements.settings.buttons[setting].querySelector('.' + this.config.classNames.menu.value);
- label.innerHTML = controls.getLabel.call(this, setting, value);
- // Find the radio option and check it
- var target = list && list.querySelector('[value="' + value + '"]');
+ if (hasDuration) {
+ controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
+ } // Update the tooltip (if visible)
- if (is.element(target)) {
- target.checked = true;
- }
- },
+ controls.updateSeekTooltip.call(this);
+ },
+ // Hide/show a tab
+ toggleMenuButton: function toggleMenuButton(setting, toggle) {
+ toggleHidden(this.elements.settings.buttons[setting], !toggle);
+ },
+ // Update the selected setting
+ updateSetting: function updateSetting(setting, container, input) {
+ var pane = this.elements.settings.panels[setting];
+ var value = null;
+ var list = container;
- // Translate a value into a nice label
- getLabel: function getLabel(setting, value) {
- switch (setting) {
- case 'speed':
- return value === 1 ? i18n.get('normal', this.config) : value + '&times;';
+ if (setting === 'captions') {
+ value = this.currentTrack;
+ } else {
+ value = !is.empty(input) ? input : this[setting]; // Get default
- case 'quality':
- if (is.number(value)) {
- var label = i18n.get('qualityLabel.' + value, this.config);
+ if (is.empty(value)) {
+ value = this.config[setting].default;
+ } // Unsupported value
- if (!label.length) {
- return value + 'p';
- }
- return label;
- }
+ if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {
+ this.debug.warn("Unsupported value of '".concat(value, "' for ").concat(setting));
+ return;
+ } // Disabled value
- return toTitleCase(value);
- case 'captions':
- return captions.getLabel.call(this);
+ if (!this.config[setting].options.includes(value)) {
+ this.debug.warn("Disabled value of '".concat(value, "' for ").concat(setting));
+ return;
+ }
+ } // Get the list if we need to
- default:
- return null;
- }
- },
+ if (!is.element(list)) {
+ list = pane && pane.querySelector('[role="menu"]');
+ } // If there's no list it means it's not been rendered...
- // Set the quality menu
- setQualityMenu: function setQualityMenu(options) {
- var _this5 = this;
- // Menu required
- if (!is.element(this.elements.settings.panels.quality)) {
- return;
- }
+ if (!is.element(list)) {
+ return;
+ } // Update the label
- var type = 'quality';
- var list = this.elements.settings.panels.quality.querySelector('[role="menu"]');
- // Set options if passed and filter based on uniqueness and config
- if (is.array(options)) {
- this.options.quality = dedupe(options).filter(function (quality) {
- return _this5.config.quality.options.includes(quality);
- });
- }
+ var label = this.elements.settings.buttons[setting].querySelector(".".concat(this.config.classNames.menu.value));
+ label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it
- // Toggle the pane and tab
- var toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;
- controls.toggleMenuButton.call(this, type, toggle);
+ var target = list && list.querySelector("[value=\"".concat(value, "\"]"));
- // Empty the menu
- emptyElement(list);
+ if (is.element(target)) {
+ target.checked = true;
+ }
+ },
+ // Translate a value into a nice label
+ getLabel: function getLabel(setting, value) {
+ switch (setting) {
+ case 'speed':
+ return value === 1 ? i18n.get('normal', this.config) : "".concat(value, "&times;");
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
+ case 'quality':
+ if (is.number(value)) {
+ var label = i18n.get("qualityLabel.".concat(value), this.config);
- // If we're hiding, nothing more to do
- if (!toggle) {
- return;
+ if (!label.length) {
+ return "".concat(value, "p");
}
- // Get the badge HTML for HD, 4K etc
- var getBadge = function getBadge(quality) {
- var label = i18n.get('qualityBadge.' + quality, _this5.config);
-
- if (!label.length) {
- return null;
- }
-
- return controls.createBadge.call(_this5, label);
- };
-
- // Sort options by the config and then render options
- this.options.quality.sort(function (a, b) {
- var sorting = _this5.config.quality.options;
- return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
- }).forEach(function (quality) {
- controls.createMenuItem.call(_this5, {
- value: quality,
- list: list,
- type: type,
- title: controls.getLabel.call(_this5, 'quality', quality),
- badge: getBadge(quality)
- });
- });
-
- controls.updateSetting.call(this, type, list);
- },
-
+ return label;
+ }
- // Set the looping options
- /* setLoopMenu() {
- // Menu required
- if (!is.element(this.elements.settings.panels.loop)) {
- return;
- }
- const options = ['start', 'end', 'all', 'reset'];
- const list = this.elements.settings.panels.loop.querySelector('[role="menu"]');
- // Show the pane and tab
- toggleHidden(this.elements.settings.buttons.loop, false);
- toggleHidden(this.elements.settings.panels.loop, false);
- // Toggle the pane and tab
- const toggle = !is.empty(this.loop.options);
- controls.toggleMenuButton.call(this, 'loop', toggle);
- // Empty the menu
- emptyElement(list);
- options.forEach(option => {
- const item = createElement('li');
- const button = createElement(
- 'button',
- extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
- type: 'button',
- class: this.config.classNames.control,
- 'data-plyr-loop-action': option,
- }),
- i18n.get(option, this.config)
- );
- if (['start', 'end'].includes(option)) {
- const badge = controls.createBadge.call(this, '00:00');
- button.appendChild(badge);
- }
- item.appendChild(button);
- list.appendChild(item);
- });
- }, */
+ return toTitleCase(value);
- // Get current selected caption language
- // TODO: rework this to user the getter in the API?
+ case 'captions':
+ return captions.getLabel.call(this);
- // Set a list of available captions languages
- setCaptionsMenu: function setCaptionsMenu() {
- var _this6 = this;
+ default:
+ return null;
+ }
+ },
+ // Set the quality menu
+ setQualityMenu: function setQualityMenu(options) {
+ var _this5 = this;
+
+ // Menu required
+ if (!is.element(this.elements.settings.panels.quality)) {
+ return;
+ }
- // Menu required
- if (!is.element(this.elements.settings.panels.captions)) {
- return;
- }
+ var type = 'quality';
+ var list = this.elements.settings.panels.quality.querySelector('[role="menu"]'); // Set options if passed and filter based on uniqueness and config
- // TODO: Captions or language? Currently it's mixed
- var type = 'captions';
- var list = this.elements.settings.panels.captions.querySelector('[role="menu"]');
- var tracks = captions.getTracks.call(this);
- var toggle = Boolean(tracks.length);
+ if (is.array(options)) {
+ this.options.quality = dedupe(options).filter(function (quality) {
+ return _this5.config.quality.options.includes(quality);
+ });
+ } // Toggle the pane and tab
- // Toggle the pane and tab
- controls.toggleMenuButton.call(this, type, toggle);
- // Empty the menu
- emptyElement(list);
+ var toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
+ emptyElement(list); // Check if we need to toggle the parent
- // If there's no captions, bail
- if (!toggle) {
- return;
- }
+ controls.checkMenu.call(this); // If we're hiding, nothing more to do
- // Generate options data
- var options = tracks.map(function (track, value) {
- return {
- value: value,
- checked: _this6.captions.toggled && _this6.currentTrack === value,
- title: captions.getLabel.call(_this6, track),
- badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()),
- list: list,
- type: 'language'
- };
- });
+ if (!toggle) {
+ return;
+ } // Get the badge HTML for HD, 4K etc
- // Add the "Disabled" option to turn off captions
- options.unshift({
- value: -1,
- checked: !this.captions.toggled,
- title: i18n.get('disabled', this.config),
- list: list,
- type: 'language'
- });
- // Generate options
- options.forEach(controls.createMenuItem.bind(this));
+ var getBadge = function getBadge(quality) {
+ var label = i18n.get("qualityBadge.".concat(quality), _this5.config);
- controls.updateSetting.call(this, type, list);
- },
+ if (!label.length) {
+ return null;
+ }
+ return controls.createBadge.call(_this5, label);
+ }; // Sort options by the config and then render options
- // Set a list of available captions languages
- setSpeedMenu: function setSpeedMenu(options) {
- var _this7 = this;
- // Menu required
- if (!is.element(this.elements.settings.panels.speed)) {
- return;
- }
+ this.options.quality.sort(function (a, b) {
+ var sorting = _this5.config.quality.options;
+ return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
+ }).forEach(function (quality) {
+ controls.createMenuItem.call(_this5, {
+ value: quality,
+ list: list,
+ type: type,
+ title: controls.getLabel.call(_this5, 'quality', quality),
+ badge: getBadge(quality)
+ });
+ });
+ controls.updateSetting.call(this, type, list);
+ },
+ // Set the looping options
- var type = 'speed';
- var list = this.elements.settings.panels.speed.querySelector('[role="menu"]');
+ /* setLoopMenu() {
+ // Menu required
+ if (!is.element(this.elements.settings.panels.loop)) {
+ return;
+ }
+ const options = ['start', 'end', 'all', 'reset'];
+ const list = this.elements.settings.panels.loop.querySelector('[role="menu"]');
+ // Show the pane and tab
+ toggleHidden(this.elements.settings.buttons.loop, false);
+ toggleHidden(this.elements.settings.panels.loop, false);
+ // Toggle the pane and tab
+ const toggle = !is.empty(this.loop.options);
+ controls.toggleMenuButton.call(this, 'loop', toggle);
+ // Empty the menu
+ emptyElement(list);
+ options.forEach(option => {
+ const item = createElement('li');
+ const button = createElement(
+ 'button',
+ extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
+ type: 'button',
+ class: this.config.classNames.control,
+ 'data-plyr-loop-action': option,
+ }),
+ i18n.get(option, this.config)
+ );
+ if (['start', 'end'].includes(option)) {
+ const badge = controls.createBadge.call(this, '00:00');
+ button.appendChild(badge);
+ }
+ item.appendChild(button);
+ list.appendChild(item);
+ });
+ }, */
+ // Get current selected caption language
+ // TODO: rework this to user the getter in the API?
+ // Set a list of available captions languages
+ setCaptionsMenu: function setCaptionsMenu() {
+ var _this6 = this;
- // Set the speed options
- if (is.array(options)) {
- this.options.speed = options;
- } else if (this.isHTML5 || this.isVimeo) {
- this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
- }
+ // Menu required
+ if (!is.element(this.elements.settings.panels.captions)) {
+ return;
+ } // TODO: Captions or language? Currently it's mixed
- // Set options if passed and filter based on config
- this.options.speed = this.options.speed.filter(function (speed) {
- return _this7.config.speed.options.includes(speed);
- });
- // Toggle the pane and tab
- var toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;
- controls.toggleMenuButton.call(this, type, toggle);
+ var type = 'captions';
+ var list = this.elements.settings.panels.captions.querySelector('[role="menu"]');
+ var tracks = captions.getTracks.call(this);
+ var toggle = Boolean(tracks.length); // Toggle the pane and tab
- // Empty the menu
- emptyElement(list);
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
+ emptyElement(list); // Check if we need to toggle the parent
- // If we're hiding, nothing more to do
- if (!toggle) {
- return;
- }
+ controls.checkMenu.call(this); // If there's no captions, bail
- // Create items
- this.options.speed.forEach(function (speed) {
- controls.createMenuItem.call(_this7, {
- value: speed,
- list: list,
- type: type,
- title: controls.getLabel.call(_this7, 'speed', speed)
- });
- });
+ if (!toggle) {
+ return;
+ } // Generate options data
- controls.updateSetting.call(this, type, list);
- },
+ var options = tracks.map(function (track, value) {
+ return {
+ value: value,
+ checked: _this6.captions.toggled && _this6.currentTrack === value,
+ title: captions.getLabel.call(_this6, track),
+ badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()),
+ list: list,
+ type: 'language'
+ };
+ }); // Add the "Disabled" option to turn off captions
+
+ options.unshift({
+ value: -1,
+ checked: !this.captions.toggled,
+ title: i18n.get('disabled', this.config),
+ list: list,
+ type: 'language'
+ }); // Generate options
+
+ options.forEach(controls.createMenuItem.bind(this));
+ controls.updateSetting.call(this, type, list);
+ },
+ // Set a list of available captions languages
+ setSpeedMenu: function setSpeedMenu(options) {
+ var _this7 = this;
+
+ // Menu required
+ if (!is.element(this.elements.settings.panels.speed)) {
+ return;
+ }
- // Check if we need to hide/show the settings menu
- checkMenu: function checkMenu() {
- var buttons = this.elements.settings.buttons;
+ var type = 'speed';
+ var list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); // Set the speed options
- var visible = !is.empty(buttons) && Object.values(buttons).some(function (button) {
- return !button.hidden;
- });
+ if (is.array(options)) {
+ this.options.speed = options;
+ } else if (this.isHTML5 || this.isVimeo) {
+ this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
+ } // Set options if passed and filter based on config
- toggleHidden(this.elements.settings.menu, !visible);
- },
+ this.options.speed = this.options.speed.filter(function (speed) {
+ return _this7.config.speed.options.includes(speed);
+ }); // Toggle the pane and tab
- // Focus the first menu item in a given (or visible) menu
- focusFirstMenuItem: function focusFirstMenuItem(pane) {
- var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
- if (this.elements.settings.popup.hidden) {
- return;
- }
+ emptyElement(list); // Check if we need to toggle the parent
- var target = pane;
+ controls.checkMenu.call(this); // If we're hiding, nothing more to do
- if (!is.element(target)) {
- target = Object.values(this.elements.settings.panels).find(function (pane) {
- return !pane.hidden;
- });
- }
+ if (!toggle) {
+ return;
+ } // Create items
- var firstItem = target.querySelector('[role^="menuitem"]');
- setFocus.call(this, firstItem, tabFocus);
- },
+ this.options.speed.forEach(function (speed) {
+ controls.createMenuItem.call(_this7, {
+ value: speed,
+ list: list,
+ type: type,
+ title: controls.getLabel.call(_this7, 'speed', speed)
+ });
+ });
+ controls.updateSetting.call(this, type, list);
+ },
+ // Check if we need to hide/show the settings menu
+ checkMenu: function checkMenu() {
+ var buttons = this.elements.settings.buttons;
+ var visible = !is.empty(buttons) && Object.values(buttons).some(function (button) {
+ return !button.hidden;
+ });
+ toggleHidden(this.elements.settings.menu, !visible);
+ },
+ // Focus the first menu item in a given (or visible) menu
+ focusFirstMenuItem: function focusFirstMenuItem(pane) {
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (this.elements.settings.popup.hidden) {
+ return;
+ }
+ var target = pane;
- // Show/hide menu
- toggleMenu: function toggleMenu(input) {
- var popup = this.elements.settings.popup;
+ if (!is.element(target)) {
+ target = Object.values(this.elements.settings.panels).find(function (pane) {
+ return !pane.hidden;
+ });
+ }
- var button = this.elements.buttons.settings;
+ var firstItem = target.querySelector('[role^="menuitem"]');
+ setFocus.call(this, firstItem, tabFocus);
+ },
+ // Show/hide menu
+ toggleMenu: function toggleMenu(input) {
+ var popup = this.elements.settings.popup;
+ var button = this.elements.buttons.settings; // Menu and button are required
+
+ if (!is.element(popup) || !is.element(button)) {
+ return;
+ } // True toggle by default
+
+
+ var hidden = popup.hidden;
+ var show = hidden;
+
+ if (is.boolean(input)) {
+ show = input;
+ } else if (is.keyboardEvent(input) && input.which === 27) {
+ show = false;
+ } else if (is.event(input)) {
+ var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click
+ // wasn't the button or menu item and we're trying to
+ // show the menu (a doc click shouldn't show the menu)
+
+ if (isMenuItem || !isMenuItem && input.target !== button && show) {
+ return;
+ }
+ } // Set button attributes
- // Menu and button are required
- if (!is.element(popup) || !is.element(button)) {
- return;
- }
- // True toggle by default
- var hidden = popup.hidden;
+ button.setAttribute('aria-expanded', show); // Show the actual popup
- var show = hidden;
+ toggleHidden(popup, !show); // Add class hook
- if (is.boolean(input)) {
- show = input;
- } else if (is.keyboardEvent(input) && input.which === 27) {
- show = false;
- } else if (is.event(input)) {
- var isMenuItem = popup.contains(input.target);
+ toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction
- // If the click was inside the menu or if the click
- // wasn't the button or menu item and we're trying to
- // show the menu (a doc click shouldn't show the menu)
- if (isMenuItem || !isMenuItem && input.target !== button && show) {
- return;
- }
- }
+ if (show && is.keyboardEvent(input)) {
+ controls.focusFirstMenuItem.call(this, null, true);
+ } else if (!show && !hidden) {
+ // If closing, re-focus the button
+ setFocus.call(this, button, is.keyboardEvent(input));
+ }
+ },
+ // Get the natural size of a menu panel
+ getMenuSize: function getMenuSize(tab) {
+ var clone = tab.cloneNode(true);
+ clone.style.position = 'absolute';
+ clone.style.opacity = 0;
+ clone.removeAttribute('hidden'); // Append to parent so we get the "real" size
+
+ tab.parentNode.appendChild(clone); // Get the sizes before we remove
+
+ var width = clone.scrollWidth;
+ var height = clone.scrollHeight; // Remove from the DOM
+
+ removeElement(clone);
+ return {
+ width: width,
+ height: height
+ };
+ },
+ // Show a panel in the menu
+ showMenuPanel: function showMenuPanel() {
+ var _this8 = this;
- // Set button attributes
- button.setAttribute('aria-expanded', show);
+ var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var target = document.getElementById("plyr-settings-".concat(this.id, "-").concat(type)); // Nothing to show, bail
- // Show the actual popup
- toggleHidden(popup, !show);
+ if (!is.element(target)) {
+ return;
+ } // Hide all other panels
- // Add class hook
- toggleClass(this.elements.container, this.config.classNames.menu.open, show);
- // Focus the first item if key interaction
- if (show && is.keyboardEvent(input)) {
- controls.focusFirstMenuItem.call(this, null, true);
- } else if (!show && !hidden) {
- // If closing, re-focus the button
- setFocus.call(this, button, is.keyboardEvent(input));
- }
- },
+ var container = target.parentNode;
+ var current = Array.from(container.children).find(function (node) {
+ return !node.hidden;
+ }); // If we can do fancy animations, we'll animate the height/width
+ if (support.transitions && !support.reducedMotion) {
+ // Set the current width as a base
+ container.style.width = "".concat(current.scrollWidth, "px");
+ container.style.height = "".concat(current.scrollHeight, "px"); // Get potential sizes
- // Get the natural size of a menu panel
- getMenuSize: function getMenuSize(tab) {
- var clone = tab.cloneNode(true);
- clone.style.position = 'absolute';
- clone.style.opacity = 0;
- clone.removeAttribute('hidden');
+ var size = controls.getMenuSize.call(this, target); // Restore auto height/width
- // Append to parent so we get the "real" size
- tab.parentNode.appendChild(clone);
+ var restore = function restore(event) {
+ // We're only bothered about height and width on the container
+ if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {
+ return;
+ } // Revert back to auto
- // Get the sizes before we remove
- var width = clone.scrollWidth;
- var height = clone.scrollHeight;
- // Remove from the DOM
- removeElement(clone);
+ container.style.width = '';
+ container.style.height = ''; // Only listen once
- return {
- width: width,
- height: height
- };
- },
+ off.call(_this8, container, transitionEndEvent, restore);
+ }; // Listen for the transition finishing and restore auto height/width
- // Show a panel in the menu
- showMenuPanel: function showMenuPanel() {
- var _this8 = this;
+ on.call(this, container, transitionEndEvent, restore); // Set dimensions to target
- var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ container.style.width = "".concat(size.width, "px");
+ container.style.height = "".concat(size.height, "px");
+ } // Set attributes on current tab
- var target = document.getElementById('plyr-settings-' + this.id + '-' + type);
- // Nothing to show, bail
- if (!is.element(target)) {
- return;
- }
+ toggleHidden(current, true); // Set attributes on target
- // Hide all other panels
- var container = target.parentNode;
- var current = Array.from(container.children).find(function (node) {
- return !node.hidden;
- });
+ toggleHidden(target, false); // Focus the first item
- // If we can do fancy animations, we'll animate the height/width
- if (support.transitions && !support.reducedMotion) {
- // Set the current width as a base
- container.style.width = current.scrollWidth + 'px';
- container.style.height = current.scrollHeight + 'px';
+ controls.focusFirstMenuItem.call(this, target, tabFocus);
+ },
+ // Build the default HTML
+ // TODO: Set order based on order in the config.controls array?
+ create: function create(data) {
+ var _this9 = this;
- // Get potential sizes
- var size = controls.getMenuSize.call(this, target);
+ // Create the container
+ var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button
- // Restore auto height/width
- var restore = function restore(event) {
- // We're only bothered about height and width on the container
- if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {
- return;
- }
+ if (this.config.controls.includes('restart')) {
+ container.appendChild(controls.createButton.call(this, 'restart'));
+ } // Rewind button
- // Revert back to auto
- container.style.width = '';
- container.style.height = '';
- // Only listen once
- off.call(_this8, container, transitionEndEvent, restore);
- };
+ if (this.config.controls.includes('rewind')) {
+ container.appendChild(controls.createButton.call(this, 'rewind'));
+ } // Play/Pause button
- // Listen for the transition finishing and restore auto height/width
- on.call(this, container, transitionEndEvent, restore);
- // Set dimensions to target
- container.style.width = size.width + 'px';
- container.style.height = size.height + 'px';
- }
+ if (this.config.controls.includes('play')) {
+ container.appendChild(controls.createButton.call(this, 'play'));
+ } // Fast forward button
- // Set attributes on current tab
- toggleHidden(current, true);
- // Set attributes on target
- toggleHidden(target, false);
+ if (this.config.controls.includes('fast-forward')) {
+ container.appendChild(controls.createButton.call(this, 'fast-forward'));
+ } // Progress
- // Focus the first item
- controls.focusFirstMenuItem.call(this, target, tabFocus);
- },
+ if (this.config.controls.includes('progress')) {
+ var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider
- // Build the default HTML
- // TODO: Set order based on order in the config.controls array?
- create: function create(data) {
- var _this9 = this;
+ progress.appendChild(controls.createRange.call(this, 'seek', {
+ id: "plyr-seek-".concat(data.id)
+ })); // Buffer progress
- // Create the container
- var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));
+ progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator
+ // Seek tooltip
- // Restart button
- if (this.config.controls.includes('restart')) {
- container.appendChild(controls.createButton.call(this, 'restart'));
- }
+ if (this.config.tooltips.seek) {
+ var tooltip = createElement('span', {
+ class: this.config.classNames.tooltip
+ }, '00:00');
+ progress.appendChild(tooltip);
+ this.elements.display.seekTooltip = tooltip;
+ }
- // Rewind button
- if (this.config.controls.includes('rewind')) {
- container.appendChild(controls.createButton.call(this, 'rewind'));
- }
+ this.elements.progress = progress;
+ container.appendChild(this.elements.progress);
+ } // Media current time display
- // Play/Pause button
- if (this.config.controls.includes('play')) {
- container.appendChild(controls.createButton.call(this, 'play'));
- }
- // Fast forward button
- if (this.config.controls.includes('fast-forward')) {
- container.appendChild(controls.createButton.call(this, 'fast-forward'));
- }
+ if (this.config.controls.includes('current-time')) {
+ container.appendChild(controls.createTime.call(this, 'currentTime'));
+ } // Media duration display
- // Progress
- if (this.config.controls.includes('progress')) {
- var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));
- // Seek range slider
- progress.appendChild(controls.createRange.call(this, 'seek', {
- id: 'plyr-seek-' + data.id
- }));
+ if (this.config.controls.includes('duration')) {
+ container.appendChild(controls.createTime.call(this, 'duration'));
+ } // Volume controls
- // Buffer progress
- progress.appendChild(controls.createProgress.call(this, 'buffer'));
- // TODO: Add loop display indicator
+ if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {
+ var volume = createElement('div', {
+ class: 'plyr__volume'
+ }); // Toggle mute button
- // Seek tooltip
- if (this.config.tooltips.seek) {
- var tooltip = createElement('span', {
- class: this.config.classNames.tooltip
- }, '00:00');
+ if (this.config.controls.includes('mute')) {
+ volume.appendChild(controls.createButton.call(this, 'mute'));
+ } // Volume range control
- progress.appendChild(tooltip);
- this.elements.display.seekTooltip = tooltip;
- }
- this.elements.progress = progress;
- container.appendChild(this.elements.progress);
- }
+ if (this.config.controls.includes('volume')) {
+ // Set the attributes
+ var attributes = {
+ max: 1,
+ step: 0.05,
+ value: this.config.volume
+ }; // Create the volume range slider
- // Media current time display
- if (this.config.controls.includes('current-time')) {
- container.appendChild(controls.createTime.call(this, 'currentTime'));
- }
+ volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {
+ id: "plyr-volume-".concat(data.id)
+ })));
+ this.elements.volume = volume;
+ }
- // Media duration display
- if (this.config.controls.includes('duration')) {
- container.appendChild(controls.createTime.call(this, 'duration'));
- }
+ container.appendChild(volume);
+ } // Toggle captions button
- // Volume controls
- if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {
- var volume = createElement('div', {
- class: 'plyr__volume'
- });
- // Toggle mute button
- if (this.config.controls.includes('mute')) {
- volume.appendChild(controls.createButton.call(this, 'mute'));
- }
+ if (this.config.controls.includes('captions')) {
+ container.appendChild(controls.createButton.call(this, 'captions'));
+ } // Settings button / menu
- // Volume range control
- if (this.config.controls.includes('volume')) {
- // Set the attributes
- var attributes = {
- max: 1,
- step: 0.05,
- value: this.config.volume
- };
-
- // Create the volume range slider
- volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {
- id: 'plyr-volume-' + data.id
- })));
-
- this.elements.volume = volume;
- }
- container.appendChild(volume);
- }
+ if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {
+ var control = createElement('div', {
+ class: 'plyr__menu',
+ hidden: ''
+ });
+ control.appendChild(controls.createButton.call(this, 'settings', {
+ 'aria-haspopup': true,
+ 'aria-controls': "plyr-settings-".concat(data.id),
+ 'aria-expanded': false
+ }));
+ var popup = createElement('div', {
+ class: 'plyr__menu__container',
+ id: "plyr-settings-".concat(data.id),
+ hidden: ''
+ });
+ var inner = createElement('div');
+ var home = createElement('div', {
+ id: "plyr-settings-".concat(data.id, "-home")
+ }); // Create the menu
- // Toggle captions button
- if (this.config.controls.includes('captions')) {
- container.appendChild(controls.createButton.call(this, 'captions'));
- }
+ var menu = createElement('div', {
+ role: 'menu'
+ });
+ home.appendChild(menu);
+ inner.appendChild(home);
+ this.elements.settings.panels.home = home; // Build the menu items
+
+ this.config.settings.forEach(function (type) {
+ // TODO: bundle this with the createMenuItem helper and bindings
+ var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), {
+ type: 'button',
+ class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--forward"),
+ role: 'menuitem',
+ 'aria-haspopup': true,
+ hidden: ''
+ })); // Bind menu shortcuts for keyboard users
+
+ controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click
+
+ on(menuItem, 'click', function () {
+ controls.showMenuPanel.call(_this9, type, false);
+ });
+ var flex = createElement('span', null, i18n.get(type, _this9.config));
+ var value = createElement('span', {
+ class: _this9.config.classNames.menu.value
+ }); // Speed contains HTML entities
+
+ value.innerHTML = data[type];
+ flex.appendChild(value);
+ menuItem.appendChild(flex);
+ menu.appendChild(menuItem); // Build the panes
+
+ var pane = createElement('div', {
+ id: "plyr-settings-".concat(data.id, "-").concat(type),
+ hidden: ''
+ }); // Back button
+
+ var backButton = createElement('button', {
+ type: 'button',
+ class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--back")
+ }); // Visible label
+
+ backButton.appendChild(createElement('span', {
+ 'aria-hidden': true
+ }, i18n.get(type, _this9.config))); // Screen reader label
+
+ backButton.appendChild(createElement('span', {
+ class: _this9.config.classNames.hidden
+ }, i18n.get('menuBack', _this9.config))); // Go back via keyboard
+
+ on(pane, 'keydown', function (event) {
+ // We only care about <-
+ if (event.which !== 37) {
+ return;
+ } // Prevent seek
+
+
+ event.preventDefault();
+ event.stopPropagation(); // Show the respective menu
+
+ controls.showMenuPanel.call(_this9, 'home', true);
+ }, false); // Go back via button click
+
+ on(backButton, 'click', function () {
+ controls.showMenuPanel.call(_this9, 'home', false);
+ }); // Add to pane
+
+ pane.appendChild(backButton); // Menu
+
+ pane.appendChild(createElement('div', {
+ role: 'menu'
+ }));
+ inner.appendChild(pane);
+ _this9.elements.settings.buttons[type] = menuItem;
+ _this9.elements.settings.panels[type] = pane;
+ });
+ popup.appendChild(inner);
+ control.appendChild(popup);
+ container.appendChild(control);
+ this.elements.settings.popup = popup;
+ this.elements.settings.menu = control;
+ } // Picture in picture button
- // Settings button / menu
- if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {
- var control = createElement('div', {
- class: 'plyr__menu',
- hidden: ''
- });
- control.appendChild(controls.createButton.call(this, 'settings', {
- 'aria-haspopup': true,
- 'aria-controls': 'plyr-settings-' + data.id,
- 'aria-expanded': false
- }));
+ if (this.config.controls.includes('pip') && support.pip) {
+ container.appendChild(controls.createButton.call(this, 'pip'));
+ } // Airplay button
- var popup = createElement('div', {
- class: 'plyr__menu__container',
- id: 'plyr-settings-' + data.id,
- hidden: ''
- });
- var inner = createElement('div');
+ if (this.config.controls.includes('airplay') && support.airplay) {
+ container.appendChild(controls.createButton.call(this, 'airplay'));
+ } // Toggle fullscreen button
- var home = createElement('div', {
- id: 'plyr-settings-' + data.id + '-home'
- });
- // Create the menu
- var menu = createElement('div', {
- role: 'menu'
- });
+ if (this.config.controls.includes('fullscreen')) {
+ container.appendChild(controls.createButton.call(this, 'fullscreen'));
+ } // Larger overlaid play button
- home.appendChild(menu);
- inner.appendChild(home);
- this.elements.settings.panels.home = home;
-
- // Build the menu items
- this.config.settings.forEach(function (type) {
- // TODO: bundle this with the createMenuItem helper and bindings
- var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), {
- type: 'button',
- class: _this9.config.classNames.control + ' ' + _this9.config.classNames.control + '--forward',
- role: 'menuitem',
- 'aria-haspopup': true,
- hidden: ''
- }));
-
- // Bind menu shortcuts for keyboard users
- controls.bindMenuItemShortcuts.call(_this9, menuItem, type);
-
- // Show menu on click
- on(menuItem, 'click', function () {
- controls.showMenuPanel.call(_this9, type, false);
- });
-
- var flex = createElement('span', null, i18n.get(type, _this9.config));
-
- var value = createElement('span', {
- class: _this9.config.classNames.menu.value
- });
-
- // Speed contains HTML entities
- value.innerHTML = data[type];
-
- flex.appendChild(value);
- menuItem.appendChild(flex);
- menu.appendChild(menuItem);
-
- // Build the panes
- var pane = createElement('div', {
- id: 'plyr-settings-' + data.id + '-' + type,
- hidden: ''
- });
-
- // Back button
- var backButton = createElement('button', {
- type: 'button',
- class: _this9.config.classNames.control + ' ' + _this9.config.classNames.control + '--back'
- });
-
- // Visible label
- backButton.appendChild(createElement('span', {
- 'aria-hidden': true
- }, i18n.get(type, _this9.config)));
-
- // Screen reader label
- backButton.appendChild(createElement('span', {
- class: _this9.config.classNames.hidden
- }, i18n.get('menuBack', _this9.config)));
-
- // Go back via keyboard
- on(pane, 'keydown', function (event) {
- // We only care about <-
- if (event.which !== 37) {
- return;
- }
-
- // Prevent seek
- event.preventDefault();
- event.stopPropagation();
-
- // Show the respective menu
- controls.showMenuPanel.call(_this9, 'home', true);
- }, false);
-
- // Go back via button click
- on(backButton, 'click', function () {
- controls.showMenuPanel.call(_this9, 'home', false);
- });
-
- // Add to pane
- pane.appendChild(backButton);
-
- // Menu
- pane.appendChild(createElement('div', {
- role: 'menu'
- }));
-
- inner.appendChild(pane);
-
- _this9.elements.settings.buttons[type] = menuItem;
- _this9.elements.settings.panels[type] = pane;
- });
- popup.appendChild(inner);
- control.appendChild(popup);
- container.appendChild(control);
+ if (this.config.controls.includes('play-large')) {
+ this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));
+ }
- this.elements.settings.popup = popup;
- this.elements.settings.menu = control;
- }
+ this.elements.controls = container; // Set available quality levels
- // Picture in picture button
- if (this.config.controls.includes('pip') && support.pip) {
- container.appendChild(controls.createButton.call(this, 'pip'));
- }
+ if (this.isHTML5) {
+ controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));
+ }
- // Airplay button
- if (this.config.controls.includes('airplay') && support.airplay) {
- container.appendChild(controls.createButton.call(this, 'airplay'));
- }
+ controls.setSpeedMenu.call(this);
+ return container;
+ },
+ // Insert controls
+ inject: function inject() {
+ var _this10 = this;
- // Toggle fullscreen button
- if (this.config.controls.includes('fullscreen')) {
- container.appendChild(controls.createButton.call(this, 'fullscreen'));
- }
+ // Sprite
+ if (this.config.loadSprite) {
+ var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX
- // Larger overlaid play button
- if (this.config.controls.includes('play-large')) {
- this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));
- }
+ if (icon.cors) {
+ loadSprite(icon.url, 'sprite-plyr');
+ }
+ } // Create a unique ID
- this.elements.controls = container;
- // Set available quality levels
- if (this.isHTML5) {
- controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));
- }
+ this.id = Math.floor(Math.random() * 10000); // Null by default
- controls.setSpeedMenu.call(this);
+ var container = null;
+ this.elements.controls = null; // Set template properties
- return container;
- },
+ var props = {
+ id: this.id,
+ seektime: this.config.seekTime,
+ title: this.config.title
+ };
+ var update = true; // If function, run it and use output
+ if (is.function(this.config.controls)) {
+ this.config.controls = this.config.controls.call(this.props);
+ } // Convert falsy controls to empty array (primarily for empty strings)
- // Insert controls
- inject: function inject() {
- var _this10 = this;
- // Sprite
- if (this.config.loadSprite) {
- var icon = controls.getIconUrl.call(this);
+ if (!this.config.controls) {
+ this.config.controls = [];
+ }
- // Only load external sprite using AJAX
- if (icon.cors) {
- loadSprite(icon.url, 'sprite-plyr');
- }
- }
+ if (is.element(this.config.controls) || is.string(this.config.controls)) {
+ // HTMLElement or Non-empty string passed as the option
+ container = this.config.controls;
+ } else {
+ // Create controls
+ container = controls.create.call(this, {
+ id: this.id,
+ seektime: this.config.seekTime,
+ speed: this.speed,
+ quality: this.quality,
+ captions: captions.getLabel.call(this) // TODO: Looping
+ // loop: 'None',
- // Create a unique ID
- this.id = Math.floor(Math.random() * 10000);
+ });
+ update = false;
+ } // Replace props with their value
- // Null by default
- var container = null;
- this.elements.controls = null;
- // Set template properties
- var props = {
- id: this.id,
- seektime: this.config.seekTime,
- title: this.config.title
- };
- var update = true;
+ var replace = function replace(input) {
+ var result = input;
+ Object.entries(props).forEach(function (_ref2) {
+ var _ref3 = _slicedToArray(_ref2, 2),
+ key = _ref3[0],
+ value = _ref3[1];
- // If function, run it and use output
- if (is.function(this.config.controls)) {
- this.config.controls = this.config.controls.call(this.props);
- }
+ result = replaceAll(result, "{".concat(key, "}"), value);
+ });
+ return result;
+ }; // Update markup
- // Convert falsy controls to empty array (primarily for empty strings)
- if (!this.config.controls) {
- this.config.controls = [];
- }
- if (is.element(this.config.controls) || is.string(this.config.controls)) {
- // HTMLElement or Non-empty string passed as the option
- container = this.config.controls;
- } else {
- // Create controls
- container = controls.create.call(this, {
- id: this.id,
- seektime: this.config.seekTime,
- speed: this.speed,
- quality: this.quality,
- captions: captions.getLabel.call(this)
- // TODO: Looping
- // loop: 'None',
- });
- update = false;
- }
-
- // Replace props with their value
- var replace = function replace(input) {
- var result = input;
+ if (update) {
+ if (is.string(this.config.controls)) {
+ container = replace(container);
+ } else if (is.element(container)) {
+ container.innerHTML = replace(container.innerHTML);
+ }
+ } // Controls container
- Object.entries(props).forEach(function (_ref2) {
- var _ref3 = slicedToArray(_ref2, 2),
- key = _ref3[0],
- value = _ref3[1];
- result = replaceAll(result, '{' + key + '}', value);
- });
+ var target; // Inject to custom location
- return result;
- };
+ if (is.string(this.config.selectors.controls.container)) {
+ target = document.querySelector(this.config.selectors.controls.container);
+ } // Inject into the container by default
- // Update markup
- if (update) {
- if (is.string(this.config.controls)) {
- container = replace(container);
- } else if (is.element(container)) {
- container.innerHTML = replace(container.innerHTML);
- }
- }
- // Controls container
- var target = void 0;
+ if (!is.element(target)) {
+ target = this.elements.container;
+ } // Inject controls HTML (needs to be before captions, hence "afterbegin")
- // Inject to custom location
- if (is.string(this.config.selectors.controls.container)) {
- target = document.querySelector(this.config.selectors.controls.container);
- }
- // Inject into the container by default
- if (!is.element(target)) {
- target = this.elements.container;
- }
+ var insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';
+ target[insertMethod]('afterbegin', container); // Find the elements if need be
- // Inject controls HTML (needs to be before captions, hence "afterbegin")
- var insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';
- target[insertMethod]('afterbegin', container);
+ if (!is.element(this.elements.controls)) {
+ controls.findElements.call(this);
+ } // Add pressed property to buttons
- // Find the elements if need be
- if (!is.element(this.elements.controls)) {
- controls.findElements.call(this);
- }
- // Add pressed property to buttons
- if (!is.empty(this.elements.buttons)) {
- var addProperty = function addProperty(button) {
- var className = _this10.config.classNames.controlPressed;
- Object.defineProperty(button, 'pressed', {
- enumerable: true,
- get: function get$$1() {
- return hasClass(button, className);
- },
- set: function set$$1() {
- var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- toggleClass(button, className, pressed);
- }
- });
- };
-
- // Toggle classname when pressed property is set
- Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {
- if (is.array(button) || is.nodeList(button)) {
- Array.from(button).filter(Boolean).forEach(addProperty);
- } else {
- addProperty(button);
- }
- });
- }
-
- // Edge sometimes doesn't finish the paint so force a redraw
- if (window.navigator.userAgent.includes('Edge')) {
- repaint(target);
+ if (!is.empty(this.elements.buttons)) {
+ var addProperty = function addProperty(button) {
+ var className = _this10.config.classNames.controlPressed;
+ Object.defineProperty(button, 'pressed', {
+ enumerable: true,
+ get: function get() {
+ return hasClass(button, className);
+ },
+ set: function set() {
+ var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ toggleClass(button, className, pressed);
}
+ });
+ }; // Toggle classname when pressed property is set
- // Setup tooltips
- if (this.config.tooltips.controls) {
- var _config = this.config,
- classNames = _config.classNames,
- selectors = _config.selectors;
- var selector = selectors.controls.wrapper + ' ' + selectors.labels + ' .' + classNames.hidden;
- var labels = getElements.call(this, selector);
-
- Array.from(labels).forEach(function (label) {
- toggleClass(label, _this10.config.classNames.hidden, false);
- toggleClass(label, _this10.config.classNames.tooltip, true);
- });
- }
- }
- };
-
- // ==========================================================================
+ Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {
+ if (is.array(button) || is.nodeList(button)) {
+ Array.from(button).filter(Boolean).forEach(addProperty);
+ } else {
+ addProperty(button);
+ }
+ });
+ } // Edge sometimes doesn't finish the paint so force a redraw
- /**
- * Parse a string to a URL object
- * @param {string} input - the URL to be parsed
- * @param {boolean} safe - failsafe parsing
- */
- function parseUrl(input) {
- var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- var url = input;
+ if (window.navigator.userAgent.includes('Edge')) {
+ repaint(target);
+ } // Setup tooltips
- if (safe) {
- var parser = document.createElement('a');
- parser.href = url;
- url = parser.href;
- }
- try {
- return new URL(url);
- } catch (e) {
- return null;
- }
+ if (this.config.tooltips.controls) {
+ var _this$config = this.config,
+ classNames = _this$config.classNames,
+ selectors = _this$config.selectors;
+ var selector = "".concat(selectors.controls.wrapper, " ").concat(selectors.labels, " .").concat(classNames.hidden);
+ var labels = getElements.call(this, selector);
+ Array.from(labels).forEach(function (label) {
+ toggleClass(label, _this10.config.classNames.hidden, false);
+ toggleClass(label, _this10.config.classNames.tooltip, true);
+ });
+ }
}
-
- // Convert object to URLSearchParams
- function buildUrlParams(input) {
- var params = new URLSearchParams();
-
- if (is.object(input)) {
- Object.entries(input).forEach(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- key = _ref2[0],
- value = _ref2[1];
-
- params.set(key, value);
- });
- }
-
- return params;
+ };
+
+ /**
+ * Parse a string to a URL object
+ * @param {string} input - the URL to be parsed
+ * @param {boolean} safe - failsafe parsing
+ */
+
+ function parseUrl(input) {
+ var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ var url = input;
+
+ if (safe) {
+ var parser = document.createElement('a');
+ parser.href = url;
+ url = parser.href;
}
- // ==========================================================================
+ try {
+ return new URL(url);
+ } catch (e) {
+ return null;
+ }
+ } // Convert object to URLSearchParams
- var captions = {
- // Setup captions
- setup: function setup() {
- // Requires UI support
- if (!this.supported.ui) {
- return;
- }
+ function buildUrlParams(input) {
+ var params = new URLSearchParams();
- // Only Vimeo and HTML5 video supported at this point
- if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
- // Clear menu and hide
- if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
- controls.setCaptionsMenu.call(this);
- }
+ if (is.object(input)) {
+ Object.entries(input).forEach(function (_ref) {
+ var _ref2 = _slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
- return;
- }
+ params.set(key, value);
+ });
+ }
- // Inject the container
- if (!is.element(this.elements.captions)) {
- this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
+ return params;
+ }
- insertAfter(this.elements.captions, this.elements.wrapper);
- }
+ var captions = {
+ // Setup captions
+ setup: function setup() {
+ // Requires UI support
+ if (!this.supported.ui) {
+ return;
+ } // Only Vimeo and HTML5 video supported at this point
- // Fix IE captions if CORS is used
- // Fetch captions and inject as blobs instead (data URIs not supported!)
- if (browser.isIE && window.URL) {
- var elements = this.media.querySelectorAll('track');
-
- Array.from(elements).forEach(function (track) {
- var src = track.getAttribute('src');
- var url = parseUrl(src);
-
- if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
- fetch(src, 'blob').then(function (blob) {
- track.setAttribute('src', window.URL.createObjectURL(blob));
- }).catch(function () {
- removeElement(track);
- });
- }
- });
- }
- // Get and set initial data
- // The "preferred" options are not realized unless / until the wanted language has a match
- // * languages: Array of user's browser languages.
- // * language: The language preferred by user settings or config
- // * active: The state preferred by user settings or config
- // * toggled: The real captions state
+ if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
+ // Clear menu and hide
+ if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
+ controls.setCaptionsMenu.call(this);
+ }
- var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];
- var languages = dedupe(browserLanguages.map(function (language) {
- return language.split('-')[0];
- }));
+ return;
+ } // Inject the container
- var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();
- // Use first browser language when language is 'auto'
- if (language === 'auto') {
- var _languages = slicedToArray(languages, 1);
+ if (!is.element(this.elements.captions)) {
+ this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
+ insertAfter(this.elements.captions, this.elements.wrapper);
+ } // Fix IE captions if CORS is used
+ // Fetch captions and inject as blobs instead (data URIs not supported!)
- language = _languages[0];
- }
- var active = this.storage.get('captions');
- if (!is.boolean(active)) {
- active = this.config.captions.active;
- }
+ if (browser.isIE && window.URL) {
+ var elements = this.media.querySelectorAll('track');
+ Array.from(elements).forEach(function (track) {
+ var src = track.getAttribute('src');
+ var url = parseUrl(src);
- Object.assign(this.captions, {
- toggled: false,
- active: active,
- language: language,
- languages: languages
+ if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
+ fetch(src, 'blob').then(function (blob) {
+ track.setAttribute('src', window.URL.createObjectURL(blob));
+ }).catch(function () {
+ removeElement(track);
});
-
- // Watch changes to textTracks and update captions menu
- if (this.isHTML5) {
- var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
- on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
- }
-
- // Update available languages in list next tick (the event must not be triggered before the listeners)
- setTimeout(captions.update.bind(this), 0);
- },
-
-
- // Update available language options in settings based on tracks
- update: function update() {
- var _this = this;
-
- var tracks = captions.getTracks.call(this, true);
- // Get the wanted language
- var _captions = this.captions,
- active = _captions.active,
- language = _captions.language,
- meta = _captions.meta,
- currentTrackNode = _captions.currentTrackNode;
-
- var languageExists = Boolean(tracks.find(function (track) {
- return track.language === language;
- }));
-
- // Handle tracks (add event listener and "pseudo"-default)
- if (this.isHTML5 && this.isVideo) {
- tracks.filter(function (track) {
- return !meta.get(track);
- }).forEach(function (track) {
- _this.debug.log('Track added', track);
- // Attempt to store if the original dom element was "default"
- meta.set(track, {
- default: track.mode === 'showing'
- });
-
- // Turn off native caption rendering to avoid double captions
- track.mode = 'hidden';
-
- // Add event listener for cue changes
- on.call(_this, track, 'cuechange', function () {
- return captions.updateCues.call(_this);
- });
- });
- }
-
- // Update language first time it matches, or if the previous matching track was removed
- if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {
- captions.setLanguage.call(this, language);
- captions.toggle.call(this, active && languageExists);
- }
-
- // Enable or disable captions based on track length
- toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));
-
- // Update available languages in list
- if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
- controls.setCaptionsMenu.call(this);
- }
- },
+ }
+ });
+ } // Get and set initial data
+ // The "preferred" options are not realized unless / until the wanted language has a match
+ // * languages: Array of user's browser languages.
+ // * language: The language preferred by user settings or config
+ // * active: The state preferred by user settings or config
+ // * toggled: The real captions state
- // Toggle captions display
- // Used internally for the toggleCaptions method, with the passive option forced to false
- toggle: function toggle(input) {
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];
+ var languages = dedupe(browserLanguages.map(function (language) {
+ return language.split('-')[0];
+ }));
+ var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'
- // If there's no full support
- if (!this.supported.ui) {
- return;
- }
+ if (language === 'auto') {
+ var _languages = _slicedToArray(languages, 1);
- var toggled = this.captions.toggled; // Current state
+ language = _languages[0];
+ }
- var activeClass = this.config.classNames.captions.active;
+ var active = this.storage.get('captions');
- // Get the next state
- // If the method is called without parameter, toggle based on current value
- var active = is.nullOrUndefined(input) ? !toggled : input;
+ if (!is.boolean(active)) {
+ active = this.config.captions.active;
+ }
- // Update state and trigger event
- if (active !== toggled) {
- // When passive, don't override user preferences
- if (!passive) {
- this.captions.active = active;
- this.storage.set({ captions: active });
- }
+ Object.assign(this.captions, {
+ toggled: false,
+ active: active,
+ language: language,
+ languages: languages
+ }); // Watch changes to textTracks and update captions menu
- // Force language if the call isn't passive and there is no matching language to toggle to
- if (!this.language && active && !passive) {
- var tracks = captions.getTracks.call(this);
- var track = captions.findTrack.call(this, [this.captions.language].concat(toConsumableArray(this.captions.languages)), true);
+ if (this.isHTML5) {
+ var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
+ on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
+ } // Update available languages in list next tick (the event must not be triggered before the listeners)
- // Override user preferences to avoid switching languages if a matching track is added
- this.captions.language = track.language;
- // Set caption, but don't store in localStorage as user preference
- captions.set.call(this, tracks.indexOf(track));
- return;
- }
+ setTimeout(captions.update.bind(this), 0);
+ },
+ // Update available language options in settings based on tracks
+ update: function update() {
+ var _this = this;
- // Toggle button if it's enabled
- if (this.elements.buttons.captions) {
- this.elements.buttons.captions.pressed = active;
- }
+ var tracks = captions.getTracks.call(this, true); // Get the wanted language
- // Add class hook
- toggleClass(this.elements.container, activeClass, active);
+ var _this$captions = this.captions,
+ active = _this$captions.active,
+ language = _this$captions.language,
+ meta = _this$captions.meta,
+ currentTrackNode = _this$captions.currentTrackNode;
+ var languageExists = Boolean(tracks.find(function (track) {
+ return track.language === language;
+ })); // Handle tracks (add event listener and "pseudo"-default)
- this.captions.toggled = active;
+ if (this.isHTML5 && this.isVideo) {
+ tracks.filter(function (track) {
+ return !meta.get(track);
+ }).forEach(function (track) {
+ _this.debug.log('Track added', track); // Attempt to store if the original dom element was "default"
- // Update settings menu
- controls.updateSetting.call(this, 'captions');
- // Trigger event (not used internally)
- triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
- }
- },
+ meta.set(track, {
+ default: track.mode === 'showing'
+ }); // Turn off native caption rendering to avoid double captions
+ track.mode = 'hidden'; // Add event listener for cue changes
- // Set captions by track index
- // Used internally for the currentTrack setter with the passive option forced to false
- set: function set$$1(index) {
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ on.call(_this, track, 'cuechange', function () {
+ return captions.updateCues.call(_this);
+ });
+ });
+ } // Update language first time it matches, or if the previous matching track was removed
- var tracks = captions.getTracks.call(this);
- // Disable captions if setting to -1
- if (index === -1) {
- captions.toggle.call(this, false, passive);
- return;
- }
+ if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {
+ captions.setLanguage.call(this, language);
+ captions.toggle.call(this, active && languageExists);
+ } // Enable or disable captions based on track length
- if (!is.number(index)) {
- this.debug.warn('Invalid caption argument', index);
- return;
- }
- if (!(index in tracks)) {
- this.debug.warn('Track not found', index);
- return;
- }
+ toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks)); // Update available languages in list
- if (this.captions.currentTrack !== index) {
- this.captions.currentTrack = index;
- var track = tracks[index];
+ if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
+ controls.setCaptionsMenu.call(this);
+ }
+ },
+ // Toggle captions display
+ // Used internally for the toggleCaptions method, with the passive option forced to false
+ toggle: function toggle(input) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ // If there's no full support
+ if (!this.supported.ui) {
+ return;
+ }
- var _ref = track || {},
- language = _ref.language;
+ var toggled = this.captions.toggled; // Current state
- // Store reference to node for invalidation on remove
+ var activeClass = this.config.classNames.captions.active; // Get the next state
+ // If the method is called without parameter, toggle based on current value
+ var active = is.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event
- this.captions.currentTrackNode = track;
+ if (active !== toggled) {
+ // When passive, don't override user preferences
+ if (!passive) {
+ this.captions.active = active;
+ this.storage.set({
+ captions: active
+ });
+ } // Force language if the call isn't passive and there is no matching language to toggle to
- // Update settings menu
- controls.updateSetting.call(this, 'captions');
- // When passive, don't override user preferences
- if (!passive) {
- this.captions.language = language;
- this.storage.set({ language: language });
- }
+ if (!this.language && active && !passive) {
+ var tracks = captions.getTracks.call(this);
+ var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added
- // Handle Vimeo captions
- if (this.isVimeo) {
- this.embed.enableTextTrack(language);
- }
+ this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference
- // Trigger event
- triggerEvent.call(this, this.media, 'languagechange');
- }
+ captions.set.call(this, tracks.indexOf(track));
+ return;
+ } // Toggle button if it's enabled
- // Show captions
- captions.toggle.call(this, true, passive);
- if (this.isHTML5 && this.isVideo) {
- // If we change the active track while a cue is already displayed we need to update it
- captions.updateCues.call(this);
- }
- },
+ if (this.elements.buttons.captions) {
+ this.elements.buttons.captions.pressed = active;
+ } // Add class hook
- // Set captions by language
- // Used internally for the language setter with the passive option forced to false
- setLanguage: function setLanguage(input) {
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ toggleClass(this.elements.container, activeClass, active);
+ this.captions.toggled = active; // Update settings menu
- if (!is.string(input)) {
- this.debug.warn('Invalid language argument', input);
- return;
- }
- // Normalize
- var language = input.toLowerCase();
- this.captions.language = language;
-
- // Set currentTrack
- var tracks = captions.getTracks.call(this);
- var track = captions.findTrack.call(this, [language]);
- captions.set.call(this, tracks.indexOf(track), passive);
- },
+ controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)
+ triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
+ }
+ },
+ // Set captions by track index
+ // Used internally for the currentTrack setter with the passive option forced to false
+ set: function set(index) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ var tracks = captions.getTracks.call(this); // Disable captions if setting to -1
+
+ if (index === -1) {
+ captions.toggle.call(this, false, passive);
+ return;
+ }
- // Get current valid caption tracks
- // If update is false it will also ignore tracks without metadata
- // This is used to "freeze" the language options when captions.update is false
- getTracks: function getTracks() {
- var _this2 = this;
+ if (!is.number(index)) {
+ this.debug.warn('Invalid caption argument', index);
+ return;
+ }
- var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ if (!(index in tracks)) {
+ this.debug.warn('Track not found', index);
+ return;
+ }
- // Handle media or textTracks missing or null
- var tracks = Array.from((this.media || {}).textTracks || []);
- // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
- // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
- return tracks.filter(function (track) {
- return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
- }).filter(function (track) {
- return ['captions', 'subtitles'].includes(track.kind);
- });
- },
+ if (this.captions.currentTrack !== index) {
+ this.captions.currentTrack = index;
+ var track = tracks[index];
+ var _ref = track || {},
+ language = _ref.language; // Store reference to node for invalidation on remove
- // Match tracks based on languages and get the first
- findTrack: function findTrack(languages) {
- var _this3 = this;
- var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ this.captions.currentTrackNode = track; // Update settings menu
- var tracks = captions.getTracks.call(this);
- var sortIsDefault = function sortIsDefault(track) {
- return Number((_this3.captions.meta.get(track) || {}).default);
- };
- var sorted = Array.from(tracks).sort(function (a, b) {
- return sortIsDefault(b) - sortIsDefault(a);
- });
- var track = void 0;
- languages.every(function (language) {
- track = sorted.find(function (track) {
- return track.language === language;
- });
- return !track; // Break iteration if there is a match
- });
- // If no match is found but is required, get first
- return track || (force ? sorted[0] : undefined);
- },
+ controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences
+ if (!passive) {
+ this.captions.language = language;
+ this.storage.set({
+ language: language
+ });
+ } // Handle Vimeo captions
- // Get the current track
- getCurrentTrack: function getCurrentTrack() {
- return captions.getTracks.call(this)[this.currentTrack];
- },
+ if (this.isVimeo) {
+ this.embed.enableTextTrack(language);
+ } // Trigger event
- // Get UI label for track
- getLabel: function getLabel(track) {
- var currentTrack = track;
- if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {
- currentTrack = captions.getCurrentTrack.call(this);
- }
+ triggerEvent.call(this, this.media, 'languagechange');
+ } // Show captions
- if (is.track(currentTrack)) {
- if (!is.empty(currentTrack.label)) {
- return currentTrack.label;
- }
- if (!is.empty(currentTrack.language)) {
- return track.language.toUpperCase();
- }
+ captions.toggle.call(this, true, passive);
- return i18n.get('enabled', this.config);
- }
+ if (this.isHTML5 && this.isVideo) {
+ // If we change the active track while a cue is already displayed we need to update it
+ captions.updateCues.call(this);
+ }
+ },
+ // Set captions by language
+ // Used internally for the language setter with the passive option forced to false
+ setLanguage: function setLanguage(input) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ if (!is.string(input)) {
+ this.debug.warn('Invalid language argument', input);
+ return;
+ } // Normalize
+
+
+ var language = input.toLowerCase();
+ this.captions.language = language; // Set currentTrack
+
+ var tracks = captions.getTracks.call(this);
+ var track = captions.findTrack.call(this, [language]);
+ captions.set.call(this, tracks.indexOf(track), passive);
+ },
+ // Get current valid caption tracks
+ // If update is false it will also ignore tracks without metadata
+ // This is used to "freeze" the language options when captions.update is false
+ getTracks: function getTracks() {
+ var _this2 = this;
+
+ var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ // Handle media or textTracks missing or null
+ var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
+ // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
+
+ return tracks.filter(function (track) {
+ return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
+ }).filter(function (track) {
+ return ['captions', 'subtitles'].includes(track.kind);
+ });
+ },
+ // Match tracks based on languages and get the first
+ findTrack: function findTrack(languages) {
+ var _this3 = this;
- return i18n.get('disabled', this.config);
- },
+ var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var tracks = captions.getTracks.call(this);
+ var sortIsDefault = function sortIsDefault(track) {
+ return Number((_this3.captions.meta.get(track) || {}).default);
+ };
- // Update captions using current track's active cues
- // Also optional array argument in case there isn't any track (ex: vimeo)
- updateCues: function updateCues(input) {
- // Requires UI
- if (!this.supported.ui) {
- return;
- }
+ var sorted = Array.from(tracks).sort(function (a, b) {
+ return sortIsDefault(b) - sortIsDefault(a);
+ });
+ var track;
+ languages.every(function (language) {
+ track = sorted.find(function (track) {
+ return track.language === language;
+ });
+ return !track; // Break iteration if there is a match
+ }); // If no match is found but is required, get first
+
+ return track || (force ? sorted[0] : undefined);
+ },
+ // Get the current track
+ getCurrentTrack: function getCurrentTrack() {
+ return captions.getTracks.call(this)[this.currentTrack];
+ },
+ // Get UI label for track
+ getLabel: function getLabel(track) {
+ var currentTrack = track;
+
+ if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {
+ currentTrack = captions.getCurrentTrack.call(this);
+ }
- if (!is.element(this.elements.captions)) {
- this.debug.warn('No captions element to render to');
- return;
- }
+ if (is.track(currentTrack)) {
+ if (!is.empty(currentTrack.label)) {
+ return currentTrack.label;
+ }
- // Only accept array or empty input
- if (!is.nullOrUndefined(input) && !Array.isArray(input)) {
- this.debug.warn('updateCues: Invalid input', input);
- return;
- }
+ if (!is.empty(currentTrack.language)) {
+ return track.language.toUpperCase();
+ }
- var cues = input;
+ return i18n.get('enabled', this.config);
+ }
- // Get cues from track
- if (!cues) {
- var track = captions.getCurrentTrack.call(this);
- cues = Array.from((track || {}).activeCues || []).map(function (cue) {
- return cue.getCueAsHTML();
- }).map(getHTML);
- }
+ return i18n.get('disabled', this.config);
+ },
+ // Update captions using current track's active cues
+ // Also optional array argument in case there isn't any track (ex: vimeo)
+ updateCues: function updateCues(input) {
+ // Requires UI
+ if (!this.supported.ui) {
+ return;
+ }
- // Set new caption text
- var content = cues.map(function (cueText) {
- return cueText.trim();
- }).join('\n');
- var changed = content !== this.elements.captions.innerHTML;
-
- if (changed) {
- // Empty the container and create a new child element
- emptyElement(this.elements.captions);
- var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
- caption.innerHTML = content;
- this.elements.captions.appendChild(caption);
-
- // Trigger event
- triggerEvent.call(this, this.media, 'cuechange');
- }
- }
- };
+ if (!is.element(this.elements.captions)) {
+ this.debug.warn('No captions element to render to');
+ return;
+ } // Only accept array or empty input
- // ==========================================================================
- // Plyr default config
- // ==========================================================================
- var defaults$1 = {
- // Disable
- enabled: true,
+ if (!is.nullOrUndefined(input) && !Array.isArray(input)) {
+ this.debug.warn('updateCues: Invalid input', input);
+ return;
+ }
- // Custom media title
- title: '',
+ var cues = input; // Get cues from track
- // Logging to console
- debug: false,
+ if (!cues) {
+ var track = captions.getCurrentTrack.call(this);
+ cues = Array.from((track || {}).activeCues || []).map(function (cue) {
+ return cue.getCueAsHTML();
+ }).map(getHTML);
+ } // Set new caption text
- // Auto play (if supported)
- autoplay: false,
- // Only allow one media playing at once (vimeo only)
- autopause: true,
+ var content = cues.map(function (cueText) {
+ return cueText.trim();
+ }).join('\n');
+ var changed = content !== this.elements.captions.innerHTML;
- // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
- // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
- playsinline: true,
+ if (changed) {
+ // Empty the container and create a new child element
+ emptyElement(this.elements.captions);
+ var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
+ caption.innerHTML = content;
+ this.elements.captions.appendChild(caption); // Trigger event
- // Default time to skip when rewind/fast forward
- seekTime: 10,
+ triggerEvent.call(this, this.media, 'cuechange');
+ }
+ }
+ };
+
+ // ==========================================================================
+ // Plyr default config
+ // ==========================================================================
+ var defaults = {
+ // Disable
+ enabled: true,
+ // Custom media title
+ title: '',
+ // Logging to console
+ debug: false,
+ // Auto play (if supported)
+ autoplay: false,
+ // Only allow one media playing at once (vimeo only)
+ autopause: true,
+ // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
+ // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
+ playsinline: true,
+ // Default time to skip when rewind/fast forward
+ seekTime: 10,
+ // Default volume
+ volume: 1,
+ muted: false,
+ // Pass a custom duration
+ duration: null,
+ // Display the media duration on load in the current time position
+ // If you have opted to display both duration and currentTime, this is ignored
+ displayDuration: true,
+ // Invert the current time to be a countdown
+ invertTime: true,
+ // Clicking the currentTime inverts it's value to show time left rather than elapsed
+ toggleInvert: true,
+ // Aspect ratio (for embeds)
+ ratio: '16:9',
+ // Click video container to play/pause
+ clickToPlay: true,
+ // Auto hide the controls
+ hideControls: true,
+ // Reset to start when playback ended
+ resetOnEnd: false,
+ // Disable the standard context menu
+ disableContextMenu: true,
+ // Sprite (for icons)
+ loadSprite: true,
+ iconPrefix: 'plyr',
+ iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',
+ // Blank video (used to prevent errors on source change)
+ blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
+ // Quality default
+ quality: {
+ default: 576,
+ options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]
+ },
+ // Set loops
+ loop: {
+ active: false // start: null,
+ // end: null,
+
+ },
+ // Speed default and options to display
+ speed: {
+ selected: 1,
+ options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
+ },
+ // Keyboard shortcut settings
+ keyboard: {
+ focused: true,
+ global: false
+ },
+ // Display tooltips
+ tooltips: {
+ controls: false,
+ seek: true
+ },
+ // Captions settings
+ captions: {
+ active: false,
+ language: 'auto',
+ // Listen to new tracks added after Plyr is initialized.
+ // This is needed for streaming captions, but may result in unselectable options
+ update: false
+ },
+ // Fullscreen settings
+ fullscreen: {
+ enabled: true,
+ // Allow fullscreen?
+ fallback: true,
+ // Fallback for vintage browsers
+ iosNative: false // Use the native fullscreen in iOS (disables custom controls)
+
+ },
+ // Local storage
+ storage: {
+ enabled: true,
+ key: 'plyr'
+ },
+ // Default controls
+ controls: ['play-large', // 'restart',
+ // 'rewind',
+ 'play', // 'fast-forward',
+ 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
+ settings: ['captions', 'quality', 'speed'],
+ // Localisation
+ i18n: {
+ restart: 'Restart',
+ rewind: 'Rewind {seektime}s',
+ play: 'Play',
+ pause: 'Pause',
+ fastForward: 'Forward {seektime}s',
+ seek: 'Seek',
+ seekLabel: '{currentTime} of {duration}',
+ played: 'Played',
+ buffered: 'Buffered',
+ currentTime: 'Current time',
+ duration: 'Duration',
+ volume: 'Volume',
+ mute: 'Mute',
+ unmute: 'Unmute',
+ enableCaptions: 'Enable captions',
+ disableCaptions: 'Disable captions',
+ enterFullscreen: 'Enter fullscreen',
+ exitFullscreen: 'Exit fullscreen',
+ frameTitle: 'Player for {title}',
+ captions: 'Captions',
+ settings: 'Settings',
+ menuBack: 'Go back to previous menu',
+ speed: 'Speed',
+ normal: 'Normal',
+ quality: 'Quality',
+ loop: 'Loop',
+ start: 'Start',
+ end: 'End',
+ all: 'All',
+ reset: 'Reset',
+ disabled: 'Disabled',
+ enabled: 'Enabled',
+ advertisement: 'Ad',
+ qualityBadge: {
+ 2160: '4K',
+ 1440: 'HD',
+ 1080: 'HD',
+ 720: 'HD',
+ 576: 'SD',
+ 480: 'SD'
+ }
+ },
+ // URLs
+ urls: {
+ vimeo: {
+ sdk: 'https://player.vimeo.com/api/player.js',
+ iframe: 'https://player.vimeo.com/video/{0}?{1}',
+ api: 'https://vimeo.com/api/v2/video/{0}.json'
+ },
+ youtube: {
+ sdk: 'https://www.youtube.com/iframe_api',
+ api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'
+ },
+ googleIMA: {
+ sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
+ }
+ },
+ // Custom control listeners
+ listeners: {
+ seek: null,
+ play: null,
+ pause: null,
+ restart: null,
+ rewind: null,
+ fastForward: null,
+ mute: null,
+ volume: null,
+ captions: null,
+ fullscreen: null,
+ pip: null,
+ airplay: null,
+ speed: null,
+ quality: null,
+ loop: null,
+ language: null
+ },
+ // Events to watch and bubble
+ events: [// Events to watch on HTML5 media elements and bubble
+ // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
+ 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events
+ 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube
+ 'statechange', // Quality
+ 'qualitychange', // Ads
+ 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
+ // Selectors
+ // Change these to match your template if using custom HTML
+ selectors: {
+ editable: 'input, textarea, select, [contenteditable]',
+ container: '.plyr',
+ controls: {
+ container: null,
+ wrapper: '.plyr__controls'
+ },
+ labels: '[data-plyr]',
+ buttons: {
+ play: '[data-plyr="play"]',
+ pause: '[data-plyr="pause"]',
+ restart: '[data-plyr="restart"]',
+ rewind: '[data-plyr="rewind"]',
+ fastForward: '[data-plyr="fast-forward"]',
+ mute: '[data-plyr="mute"]',
+ captions: '[data-plyr="captions"]',
+ fullscreen: '[data-plyr="fullscreen"]',
+ pip: '[data-plyr="pip"]',
+ airplay: '[data-plyr="airplay"]',
+ settings: '[data-plyr="settings"]',
+ loop: '[data-plyr="loop"]'
+ },
+ inputs: {
+ seek: '[data-plyr="seek"]',
+ volume: '[data-plyr="volume"]',
+ speed: '[data-plyr="speed"]',
+ language: '[data-plyr="language"]',
+ quality: '[data-plyr="quality"]'
+ },
+ display: {
+ currentTime: '.plyr__time--current',
+ duration: '.plyr__time--duration',
+ buffer: '.plyr__progress__buffer',
+ loop: '.plyr__progress__loop',
+ // Used later
+ volume: '.plyr__volume--display'
+ },
+ progress: '.plyr__progress',
+ captions: '.plyr__captions',
+ caption: '.plyr__caption',
+ menu: {
+ quality: '.js-plyr__menu__list--quality'
+ }
+ },
+ // Class hooks added to the player in different states
+ classNames: {
+ type: 'plyr--{0}',
+ provider: 'plyr--{0}',
+ video: 'plyr__video-wrapper',
+ embed: 'plyr__video-embed',
+ embedContainer: 'plyr__video-embed__container',
+ poster: 'plyr__poster',
+ posterEnabled: 'plyr__poster-enabled',
+ ads: 'plyr__ads',
+ control: 'plyr__control',
+ controlPressed: 'plyr__control--pressed',
+ playing: 'plyr--playing',
+ paused: 'plyr--paused',
+ stopped: 'plyr--stopped',
+ loading: 'plyr--loading',
+ hover: 'plyr--hover',
+ tooltip: 'plyr__tooltip',
+ cues: 'plyr__cues',
+ hidden: 'plyr__sr-only',
+ hideControls: 'plyr--hide-controls',
+ isIos: 'plyr--is-ios',
+ isTouch: 'plyr--is-touch',
+ uiSupported: 'plyr--full-ui',
+ noTransition: 'plyr--no-transition',
+ display: {
+ time: 'plyr__time'
+ },
+ menu: {
+ value: 'plyr__menu__value',
+ badge: 'plyr__badge',
+ open: 'plyr--menu-open'
+ },
+ captions: {
+ enabled: 'plyr--captions-enabled',
+ active: 'plyr--captions-active'
+ },
+ fullscreen: {
+ enabled: 'plyr--fullscreen-enabled',
+ fallback: 'plyr--fullscreen-fallback'
+ },
+ pip: {
+ supported: 'plyr--pip-supported',
+ active: 'plyr--pip-active'
+ },
+ airplay: {
+ supported: 'plyr--airplay-supported',
+ active: 'plyr--airplay-active'
+ },
+ tabFocus: 'plyr__tab-focus'
+ },
+ // Embed attributes
+ attributes: {
+ embed: {
+ provider: 'data-plyr-provider',
+ id: 'data-plyr-embed-id'
+ }
+ },
+ // API keys
+ keys: {
+ google: null
+ },
+ // Advertisements plugin
+ // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
+ ads: {
+ enabled: false,
+ publisherId: ''
+ }
+ };
+
+ // ==========================================================================
+ // Plyr supported types and providers
+ // ==========================================================================
+ var providers = {
+ html5: 'html5',
+ youtube: 'youtube',
+ vimeo: 'vimeo'
+ };
+ var types = {
+ audio: 'audio',
+ video: 'video'
+ };
+ /**
+ * Get provider by URL
+ * @param {string} url
+ */
+
+ function getProviderByUrl(url) {
+ // YouTube
+ if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
+ return providers.youtube;
+ } // Vimeo
+
+
+ if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
+ return providers.vimeo;
+ }
- // Default volume
- volume: 1,
- muted: false,
+ return null;
+ }
- // Pass a custom duration
- duration: null,
+ // ==========================================================================
+ // Console wrapper
+ // ==========================================================================
+ var noop = function noop() {};
- // Display the media duration on load in the current time position
- // If you have opted to display both duration and currentTime, this is ignored
- displayDuration: true,
+ var Console =
+ /*#__PURE__*/
+ function () {
+ function Console() {
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- // Invert the current time to be a countdown
- invertTime: true,
+ _classCallCheck(this, Console);
- // Clicking the currentTime inverts it's value to show time left rather than elapsed
- toggleInvert: true,
+ this.enabled = window.console && enabled;
- // Aspect ratio (for embeds)
- ratio: '16:9',
+ if (this.enabled) {
+ this.log('Debugging enabled');
+ }
+ }
- // Click video container to play/pause
- clickToPlay: true,
+ _createClass(Console, [{
+ key: "log",
+ get: function get() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
+ }
+ }, {
+ key: "warn",
+ get: function get() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
+ }
+ }, {
+ key: "error",
+ get: function get() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
+ }
+ }]);
- // Auto hide the controls
- hideControls: true,
+ return Console;
+ }();
- // Reset to start when playback ended
- resetOnEnd: false,
+ function onChange() {
+ if (!this.enabled) {
+ return;
+ } // Update toggle button
- // Disable the standard context menu
- disableContextMenu: true,
- // Sprite (for icons)
- loadSprite: true,
- iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',
+ var button = this.player.elements.buttons.fullscreen;
- // Blank video (used to prevent errors on source change)
- blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
+ if (is.element(button)) {
+ button.pressed = this.active;
+ } // Trigger an event
- // Quality default
- quality: {
- default: 576,
- options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]
- },
- // Set loops
- loop: {
- active: false
- // start: null,
- // end: null,
- },
+ triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container
- // Speed default and options to display
- speed: {
- selected: 1,
- options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
- },
+ if (!browser.isIos) {
+ trapFocus.call(this.player, this.target, this.active);
+ }
+ }
- // Keyboard shortcut settings
- keyboard: {
- focused: true,
- global: false
- },
+ function toggleFallback() {
+ var _this = this;
- // Display tooltips
- tooltips: {
- controls: false,
- seek: true
- },
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- // Captions settings
- captions: {
- active: false,
- language: 'auto',
- // Listen to new tracks added after Plyr is initialized.
- // This is needed for streaming captions, but may result in unselectable options
- update: false
- },
+ // Store or restore scroll position
+ if (toggle) {
+ this.scrollPosition = {
+ x: window.scrollX || 0,
+ y: window.scrollY || 0
+ };
+ } else {
+ window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
+ } // Toggle scroll
- // Fullscreen settings
- fullscreen: {
- enabled: true, // Allow fullscreen?
- fallback: true, // Fallback for vintage browsers
- iosNative: false // Use the native fullscreen in iOS (disables custom controls)
- },
- // Local storage
- storage: {
- enabled: true,
- key: 'plyr'
- },
+ document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook
- // Default controls
- controls: ['play-large',
- // 'restart',
- // 'rewind',
- 'play',
- // 'fast-forward',
- 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
- settings: ['captions', 'quality', 'speed'],
-
- // Localisation
- i18n: {
- restart: 'Restart',
- rewind: 'Rewind {seektime}s',
- play: 'Play',
- pause: 'Pause',
- fastForward: 'Forward {seektime}s',
- seek: 'Seek',
- seekLabel: '{currentTime} of {duration}',
- played: 'Played',
- buffered: 'Buffered',
- currentTime: 'Current time',
- duration: 'Duration',
- volume: 'Volume',
- mute: 'Mute',
- unmute: 'Unmute',
- enableCaptions: 'Enable captions',
- disableCaptions: 'Disable captions',
- enterFullscreen: 'Enter fullscreen',
- exitFullscreen: 'Exit fullscreen',
- frameTitle: 'Player for {title}',
- captions: 'Captions',
- settings: 'Settings',
- menuBack: 'Go back to previous menu',
- speed: 'Speed',
- normal: 'Normal',
- quality: 'Quality',
- loop: 'Loop',
- start: 'Start',
- end: 'End',
- all: 'All',
- reset: 'Reset',
- disabled: 'Disabled',
- enabled: 'Enabled',
- advertisement: 'Ad',
- qualityBadge: {
- 2160: '4K',
- 1440: 'HD',
- 1080: 'HD',
- 720: 'HD',
- 576: 'SD',
- 480: 'SD'
- }
- },
+ toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
- // URLs
- urls: {
- vimeo: {
- sdk: 'https://player.vimeo.com/api/player.js',
- iframe: 'https://player.vimeo.com/video/{0}?{1}',
- api: 'https://vimeo.com/api/v2/video/{0}.json'
- },
- youtube: {
- sdk: 'https://www.youtube.com/iframe_api',
- api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'
- },
- googleIMA: {
- sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
- }
- },
+ if (browser.isIos) {
+ var viewport = document.head.querySelector('meta[name="viewport"]');
+ var property = 'viewport-fit=cover'; // Inject the viewport meta if required
- // Custom control listeners
- listeners: {
- seek: null,
- play: null,
- pause: null,
- restart: null,
- rewind: null,
- fastForward: null,
- mute: null,
- volume: null,
- captions: null,
- fullscreen: null,
- pip: null,
- airplay: null,
- speed: null,
- quality: null,
- loop: null,
- language: null
- },
+ if (!viewport) {
+ viewport = document.createElement('meta');
+ viewport.setAttribute('name', 'viewport');
+ } // Check if the property already exists
- // Events to watch and bubble
- events: [
- // Events to watch on HTML5 media elements and bubble
- // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
- 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',
- // Custom events
- 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',
+ var hasProperty = is.string(viewport.content) && viewport.content.includes(property);
- // YouTube
- 'statechange',
+ if (toggle) {
+ this.cleanupViewport = !hasProperty;
- // Quality
- 'qualitychange',
+ if (!hasProperty) {
+ viewport.content += ",".concat(property);
+ }
+ } else if (this.cleanupViewport) {
+ viewport.content = viewport.content.split(',').filter(function (part) {
+ return part.trim() !== property;
+ }).join(',');
+ } // Force a repaint as sometimes Safari doesn't want to fill the screen
- // Ads
- 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
- // Selectors
- // Change these to match your template if using custom HTML
- selectors: {
- editable: 'input, textarea, select, [contenteditable]',
- container: '.plyr',
- controls: {
- container: null,
- wrapper: '.plyr__controls'
- },
- labels: '[data-plyr]',
- buttons: {
- play: '[data-plyr="play"]',
- pause: '[data-plyr="pause"]',
- restart: '[data-plyr="restart"]',
- rewind: '[data-plyr="rewind"]',
- fastForward: '[data-plyr="fast-forward"]',
- mute: '[data-plyr="mute"]',
- captions: '[data-plyr="captions"]',
- fullscreen: '[data-plyr="fullscreen"]',
- pip: '[data-plyr="pip"]',
- airplay: '[data-plyr="airplay"]',
- settings: '[data-plyr="settings"]',
- loop: '[data-plyr="loop"]'
- },
- inputs: {
- seek: '[data-plyr="seek"]',
- volume: '[data-plyr="volume"]',
- speed: '[data-plyr="speed"]',
- language: '[data-plyr="language"]',
- quality: '[data-plyr="quality"]'
- },
- display: {
- currentTime: '.plyr__time--current',
- duration: '.plyr__time--duration',
- buffer: '.plyr__progress__buffer',
- loop: '.plyr__progress__loop', // Used later
- volume: '.plyr__volume--display'
- },
- progress: '.plyr__progress',
- captions: '.plyr__captions',
- caption: '.plyr__caption',
- menu: {
- quality: '.js-plyr__menu__list--quality'
- }
- },
+ setTimeout(function () {
+ return repaint(_this.target);
+ }, 100);
+ } // Toggle button and fire events
- // Class hooks added to the player in different states
- classNames: {
- type: 'plyr--{0}',
- provider: 'plyr--{0}',
- video: 'plyr__video-wrapper',
- embed: 'plyr__video-embed',
- embedContainer: 'plyr__video-embed__container',
- poster: 'plyr__poster',
- posterEnabled: 'plyr__poster-enabled',
- ads: 'plyr__ads',
- control: 'plyr__control',
- controlPressed: 'plyr__control--pressed',
- playing: 'plyr--playing',
- paused: 'plyr--paused',
- stopped: 'plyr--stopped',
- loading: 'plyr--loading',
- hover: 'plyr--hover',
- tooltip: 'plyr__tooltip',
- cues: 'plyr__cues',
- hidden: 'plyr__sr-only',
- hideControls: 'plyr--hide-controls',
- isIos: 'plyr--is-ios',
- isTouch: 'plyr--is-touch',
- uiSupported: 'plyr--full-ui',
- noTransition: 'plyr--no-transition',
- display: {
- time: 'plyr__time'
- },
- menu: {
- value: 'plyr__menu__value',
- badge: 'plyr__badge',
- open: 'plyr--menu-open'
- },
- captions: {
- enabled: 'plyr--captions-enabled',
- active: 'plyr--captions-active'
- },
- fullscreen: {
- enabled: 'plyr--fullscreen-enabled',
- fallback: 'plyr--fullscreen-fallback'
- },
- pip: {
- supported: 'plyr--pip-supported',
- active: 'plyr--pip-active'
- },
- airplay: {
- supported: 'plyr--airplay-supported',
- active: 'plyr--airplay-active'
- },
- tabFocus: 'plyr__tab-focus'
- },
- // Embed attributes
- attributes: {
- embed: {
- provider: 'data-plyr-provider',
- id: 'data-plyr-embed-id'
- }
- },
+ onChange.call(this);
+ }
- // API keys
- keys: {
- google: null
- },
+ var Fullscreen =
+ /*#__PURE__*/
+ function () {
+ function Fullscreen(player) {
+ var _this2 = this;
- // Advertisements plugin
- // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
- ads: {
- enabled: false,
- publisherId: ''
- }
- };
+ _classCallCheck(this, Fullscreen);
- // ==========================================================================
- // Plyr supported types and providers
- // ==========================================================================
+ // Keep reference to parent
+ this.player = player; // Get prefix
- var providers = {
- html5: 'html5',
- youtube: 'youtube',
- vimeo: 'vimeo'
- };
+ this.prefix = Fullscreen.prefix;
+ this.property = Fullscreen.property; // Scroll position
- var types = {
- audio: 'audio',
- video: 'video'
- };
+ this.scrollPosition = {
+ x: 0,
+ y: 0
+ }; // Register event listeners
+ // Handle event (incase user presses escape etc)
- /**
- * Get provider by URL
- * @param {string} url
- */
- function getProviderByUrl(url) {
- // YouTube
- if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
- return providers.youtube;
- }
+ on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () {
+ // TODO: Filter for target??
+ onChange.call(_this2);
+ }); // Fullscreen toggle on double click
- // Vimeo
- if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
- return providers.vimeo;
+ on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
+ // Ignore double click in controls
+ if (is.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) {
+ return;
}
- return null;
- }
-
- // ==========================================================================
- // Console wrapper
- // ==========================================================================
+ _this2.toggle();
+ }); // Update the UI
- var noop = function noop() {};
+ this.update();
+ } // Determine if native supported
- var Console = function () {
- function Console() {
- var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- classCallCheck(this, Console);
- this.enabled = window.console && enabled;
+ _createClass(Fullscreen, [{
+ key: "update",
+ // Update UI
+ value: function update() {
+ if (this.enabled) {
+ this.player.debug.log("".concat(Fullscreen.native ? 'Native' : 'Fallback', " fullscreen enabled"));
+ } else {
+ this.player.debug.log('Fullscreen not supported and fallback disabled');
+ } // Add styling hook to show button
- if (this.enabled) {
- this.log('Debugging enabled');
- }
- }
- createClass(Console, [{
- key: 'log',
- get: function get$$1() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
- }
- }, {
- key: 'warn',
- get: function get$$1() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
- }
- }, {
- key: 'error',
- get: function get$$1() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
- }
- }]);
- return Console;
- }();
-
- // ==========================================================================
+ toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
+ } // Make an element fullscreen
- function onChange() {
+ }, {
+ key: "enter",
+ value: function enter() {
if (!this.enabled) {
- return;
+ return;
+ } // iOS native fullscreen doesn't need the request step
+
+
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
+ this.target.webkitEnterFullscreen();
+ } else if (!Fullscreen.native) {
+ toggleFallback.call(this, true);
+ } else if (!this.prefix) {
+ this.target.requestFullscreen();
+ } else if (!is.empty(this.prefix)) {
+ this.target["".concat(this.prefix, "Request").concat(this.property)]();
}
+ } // Bail from fullscreen
- // Update toggle button
- var button = this.player.elements.buttons.fullscreen;
- if (is.element(button)) {
- button.pressed = this.active;
+ }, {
+ key: "exit",
+ value: function exit() {
+ if (!this.enabled) {
+ return;
+ } // iOS native fullscreen
+
+
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
+ this.target.webkitExitFullscreen();
+ this.player.play();
+ } else if (!Fullscreen.native) {
+ toggleFallback.call(this, false);
+ } else if (!this.prefix) {
+ (document.cancelFullScreen || document.exitFullscreen).call(document);
+ } else if (!is.empty(this.prefix)) {
+ var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
+ document["".concat(this.prefix).concat(action).concat(this.property)]();
}
+ } // Toggle state
- // Trigger an event
- triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
-
- // Trap focus in container
- if (!browser.isIos) {
- trapFocus.call(this.player, this.target, this.active);
+ }, {
+ key: "toggle",
+ value: function toggle() {
+ if (!this.active) {
+ this.enter();
+ } else {
+ this.exit();
}
- }
+ }
+ }, {
+ key: "enabled",
+ // Determine if fullscreen is enabled
+ get: function get() {
+ return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
+ } // Get active state
+
+ }, {
+ key: "active",
+ get: function get() {
+ if (!this.enabled) {
+ return false;
+ } // Fallback using classname
- function toggleFallback() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- // Store or restore scroll position
- if (toggle) {
- this.scrollPosition = {
- x: window.scrollX || 0,
- y: window.scrollY || 0
- };
- } else {
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
+ if (!Fullscreen.native) {
+ return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
}
- // Toggle scroll
- document.body.style.overflow = toggle ? 'hidden' : '';
+ var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")];
+ return element === this.target;
+ } // Get target element
- // Toggle class hook
- toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);
+ }, {
+ key: "target",
+ get: function get() {
+ return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
+ }
+ }], [{
+ key: "native",
+ get: function get() {
+ return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
+ } // Get the prefix for handlers
+
+ }, {
+ key: "prefix",
+ get: function get() {
+ // No prefix
+ if (is.function(document.exitFullscreen)) {
+ return '';
+ } // Check for fullscreen support by vendor prefix
+
+
+ var value = '';
+ var prefixes = ['webkit', 'moz', 'ms'];
+ prefixes.some(function (pre) {
+ if (is.function(document["".concat(pre, "ExitFullscreen")]) || is.function(document["".concat(pre, "CancelFullScreen")])) {
+ value = pre;
+ return true;
+ }
- // Toggle button and fire events
- onChange.call(this);
- }
+ return false;
+ });
+ return value;
+ }
+ }, {
+ key: "property",
+ get: function get() {
+ return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
+ }
+ }]);
+
+ return Fullscreen;
+ }();
+
+ // ==========================================================================
+ // Load image avoiding xhr/fetch CORS issues
+ // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
+ // By default it checks if it is at least 1px, but you can add a second argument to change this
+ // ==========================================================================
+ function loadImage(src) {
+ var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
+ return new Promise(function (resolve, reject) {
+ var image = new Image();
+
+ var handler = function handler() {
+ delete image.onload;
+ delete image.onerror;
+ (image.naturalWidth >= minWidth ? resolve : reject)(image);
+ };
- var Fullscreen = function () {
- function Fullscreen(player) {
- var _this = this;
+ Object.assign(image, {
+ onload: handler,
+ onerror: handler,
+ src: src
+ });
+ });
+ }
+
+ // ==========================================================================
+ var ui = {
+ addStyleHook: function addStyleHook() {
+ toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
+ toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
+ },
+ // Toggle native HTML5 media controls
+ toggleNativeControls: function toggleNativeControls() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ if (toggle && this.isHTML5) {
+ this.media.setAttribute('controls', '');
+ } else {
+ this.media.removeAttribute('controls');
+ }
+ },
+ // Setup the UI
+ build: function build() {
+ var _this = this;
- classCallCheck(this, Fullscreen);
+ // Re-attach media element listeners
+ // TODO: Use event bubbling?
+ this.listeners.media(); // Don't setup interface if no support
- // Keep reference to parent
- this.player = player;
+ if (!this.supported.ui) {
+ this.debug.warn("Basic support only for ".concat(this.provider, " ").concat(this.type)); // Restore native controls
- // Get prefix
- this.prefix = Fullscreen.prefix;
- this.property = Fullscreen.property;
+ ui.toggleNativeControls.call(this, true); // Bail
- // Scroll position
- this.scrollPosition = { x: 0, y: 0 };
+ return;
+ } // Inject custom controls if not present
- // Register event listeners
- // Handle event (incase user presses escape etc)
- on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () {
- // TODO: Filter for target??
- onChange.call(_this);
- });
- // Fullscreen toggle on double click
- on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
- // Ignore double click in controls
- if (is.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
- return;
- }
+ if (!is.element(this.elements.controls)) {
+ // Inject custom controls
+ controls.inject.call(this); // Re-attach control listeners
- _this.toggle();
- });
+ this.listeners.controls();
+ } // Remove native controls
- // Update the UI
- this.update();
- }
- // Determine if native supported
+ ui.toggleNativeControls.call(this); // Setup captions for HTML5
+ if (this.isHTML5) {
+ captions.setup.call(this);
+ } // Reset volume
- createClass(Fullscreen, [{
- key: 'update',
+ this.volume = null; // Reset mute state
- // Update UI
- value: function update() {
- if (this.enabled) {
- this.player.debug.log((Fullscreen.native ? 'Native' : 'Fallback') + ' fullscreen enabled');
- } else {
- this.player.debug.log('Fullscreen not supported and fallback disabled');
- }
+ this.muted = null; // Reset speed
- // Add styling hook to show button
- toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
- }
+ this.speed = null; // Reset loop state
- // Make an element fullscreen
+ this.loop = null; // Reset quality setting
- }, {
- key: 'enter',
- value: function enter() {
- if (!this.enabled) {
- return;
- }
+ this.quality = null; // Reset volume display
- // iOS native fullscreen doesn't need the request step
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitEnterFullscreen();
- } else if (!Fullscreen.native) {
- toggleFallback.call(this, true);
- } else if (!this.prefix) {
- this.target.requestFullscreen();
- } else if (!is.empty(this.prefix)) {
- this.target[this.prefix + 'Request' + this.property]();
- }
- }
+ controls.updateVolume.call(this); // Reset time display
- // Bail from fullscreen
+ controls.timeUpdate.call(this); // Update the UI
- }, {
- key: 'exit',
- value: function exit() {
- if (!this.enabled) {
- return;
- }
+ ui.checkPlaying.call(this); // Check for picture-in-picture support
- // iOS native fullscreen
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitExitFullscreen();
- this.player.play();
- } else if (!Fullscreen.native) {
- toggleFallback.call(this, false);
- } else if (!this.prefix) {
- (document.cancelFullScreen || document.exitFullscreen).call(document);
- } else if (!is.empty(this.prefix)) {
- var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
- document['' + this.prefix + action + this.property]();
- }
- }
+ toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support
- // Toggle state
+ toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class
- }, {
- key: 'toggle',
- value: function toggle() {
- if (!this.active) {
- this.enter();
- } else {
- this.exit();
- }
- }
- }, {
- key: 'enabled',
+ toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class
+ toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls
- // Determine if fullscreen is enabled
- get: function get$$1() {
- return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
- }
+ this.ready = true; // Ready event at end of execution stack
- // Get active state
+ setTimeout(function () {
+ triggerEvent.call(_this, _this.media, 'ready');
+ }, 0); // Set the title
- }, {
- key: 'active',
- get: function get$$1() {
- if (!this.enabled) {
- return false;
- }
+ ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created
- // Fallback using classname
- if (!Fullscreen.native) {
- return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
- }
+ if (this.poster) {
+ ui.setPoster.call(this, this.poster, false).catch(function () {});
+ } // Manually set the duration if user has overridden it.
+ // The event listeners for it doesn't get called if preload is disabled (#701)
- var element = !this.prefix ? document.fullscreenElement : document['' + this.prefix + this.property + 'Element'];
- return element === this.target;
- }
-
- // Get target element
-
- }, {
- key: 'target',
- get: function get$$1() {
- return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
- }
- }], [{
- key: 'native',
- get: function get$$1() {
- return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
- }
+ if (this.config.duration) {
+ controls.durationUpdate.call(this);
+ }
+ },
+ // Setup aria attribute for play and iframe title
+ setTitle: function setTitle() {
+ // Find the current text
+ var label = i18n.get('play', this.config); // If there's a media title set, use that for the label
- // Get the prefix for handlers
+ if (is.string(this.config.title) && !is.empty(this.config.title)) {
+ label += ", ".concat(this.config.title);
+ } // If there's a play button, set label
- }, {
- key: 'prefix',
- get: function get$$1() {
- // No prefix
- if (is.function(document.exitFullscreen)) {
- return '';
- }
- // Check for fullscreen support by vendor prefix
- var value = '';
- var prefixes = ['webkit', 'moz', 'ms'];
+ Array.from(this.elements.buttons.play || []).forEach(function (button) {
+ button.setAttribute('aria-label', label);
+ }); // Set iframe title
+ // https://github.com/sampotts/plyr/issues/124
- prefixes.some(function (pre) {
- if (is.function(document[pre + 'ExitFullscreen']) || is.function(document[pre + 'CancelFullScreen'])) {
- value = pre;
- return true;
- }
+ if (this.isEmbed) {
+ var iframe = getElement.call(this, 'iframe');
- return false;
- });
+ if (!is.element(iframe)) {
+ return;
+ } // Default to media type
- return value;
- }
- }, {
- key: 'property',
- get: function get$$1() {
- return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
- }
- }]);
- return Fullscreen;
- }();
-
- // ==========================================================================
- // Load image avoiding xhr/fetch CORS issues
- // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
- // By default it checks if it is at least 1px, but you can add a second argument to change this
- // ==========================================================================
-
- function loadImage(src) {
- var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
-
- return new Promise(function (resolve, reject) {
- var image = new Image();
-
- var handler = function handler() {
- delete image.onload;
- delete image.onerror;
- (image.naturalWidth >= minWidth ? resolve : reject)(image);
- };
- Object.assign(image, { onload: handler, onerror: handler, src: src });
+ var title = !is.empty(this.config.title) ? this.config.title : 'video';
+ var format = i18n.get('frameTitle', this.config);
+ iframe.setAttribute('title', format.replace('{title}', title));
+ }
+ },
+ // Toggle poster
+ togglePoster: function togglePoster(enable) {
+ toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
+ },
+ // Set the poster image (async)
+ // Used internally for the poster setter, with the passive option forced to false
+ setPoster: function setPoster(poster) {
+ var _this2 = this;
+
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ // Don't override if call is passive
+ if (passive && this.poster) {
+ return Promise.reject(new Error('Poster already set'));
+ } // Set property synchronously to respect the call order
+
+
+ this.media.setAttribute('poster', poster); // Wait until ui is ready
+
+ return ready.call(this) // Load image
+ .then(function () {
+ return loadImage(poster);
+ }).catch(function (err) {
+ // Hide poster on error unless it's been set by another call
+ if (poster === _this2.poster) {
+ ui.togglePoster.call(_this2, false);
+ } // Rethrow
+
+
+ throw err;
+ }).then(function () {
+ // Prevent race conditions
+ if (poster !== _this2.poster) {
+ throw new Error('setPoster cancelled by later call to setPoster');
+ }
+ }).then(function () {
+ Object.assign(_this2.elements.poster.style, {
+ backgroundImage: "url('".concat(poster, "')"),
+ // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
+ backgroundSize: ''
});
- }
-
- // ==========================================================================
-
- var ui = {
- addStyleHook: function addStyleHook() {
- toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
- toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
- },
-
-
- // Toggle native HTML5 media controls
- toggleNativeControls: function toggleNativeControls() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- if (toggle && this.isHTML5) {
- this.media.setAttribute('controls', '');
- } else {
- this.media.removeAttribute('controls');
- }
- },
-
-
- // Setup the UI
- build: function build() {
- var _this = this;
-
- // Re-attach media element listeners
- // TODO: Use event bubbling?
- this.listeners.media();
+ ui.togglePoster.call(_this2, true);
+ return poster;
+ });
+ },
+ // Check playing state
+ checkPlaying: function checkPlaying(event) {
+ var _this3 = this;
- // Don't setup interface if no support
- if (!this.supported.ui) {
- this.debug.warn('Basic support only for ' + this.provider + ' ' + this.type);
+ // Class hooks
+ toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
+ toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
+ toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state
- // Restore native controls
- ui.toggleNativeControls.call(this, true);
+ Array.from(this.elements.buttons.play || []).forEach(function (target) {
+ target.pressed = _this3.playing;
+ }); // Only update controls on non timeupdate events
- // Bail
- return;
- }
+ if (is.event(event) && event.type === 'timeupdate') {
+ return;
+ } // Toggle controls
- // Inject custom controls if not present
- if (!is.element(this.elements.controls)) {
- // Inject custom controls
- controls.inject.call(this);
- // Re-attach control listeners
- this.listeners.controls();
- }
+ ui.toggleControls.call(this);
+ },
+ // Check if media is loading
+ checkLoading: function checkLoading(event) {
+ var _this4 = this;
- // Remove native controls
- ui.toggleNativeControls.call(this);
+ this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer
- // Setup captions for HTML5
- if (this.isHTML5) {
- captions.setup.call(this);
- }
+ clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking
- // Reset volume
- this.volume = null;
+ this.timers.loading = setTimeout(function () {
+ // Update progress bar loading class state
+ toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility
- // Reset mute state
- this.muted = null;
+ ui.toggleControls.call(_this4);
+ }, this.loading ? 250 : 0);
+ },
+ // Toggle controls based on state and `force` argument
+ toggleControls: function toggleControls(force) {
+ var controls$$1 = this.elements.controls;
- // Reset speed
- this.speed = null;
+ if (controls$$1 && this.config.hideControls) {
+ // Show controls if force, loading, paused, or button interaction, otherwise hide
+ this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover));
+ }
+ }
+ };
- // Reset loop state
- this.loop = null;
+ var Listeners =
+ /*#__PURE__*/
+ function () {
+ function Listeners(player) {
+ _classCallCheck(this, Listeners);
- // Reset quality setting
- this.quality = null;
+ this.player = player;
+ this.lastKey = null;
+ this.focusTimer = null;
+ this.lastKeyDown = null;
+ this.handleKey = this.handleKey.bind(this);
+ this.toggleMenu = this.toggleMenu.bind(this);
+ this.setTabFocus = this.setTabFocus.bind(this);
+ this.firstTouch = this.firstTouch.bind(this);
+ } // Handle key presses
- // Reset volume display
- controls.updateVolume.call(this);
- // Reset time display
- controls.timeUpdate.call(this);
+ _createClass(Listeners, [{
+ key: "handleKey",
+ value: function handleKey(event) {
+ var player = this.player;
+ var elements = player.elements;
+ var code = event.keyCode ? event.keyCode : event.which;
+ var pressed = event.type === 'keydown';
+ var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set
- // Update the UI
- ui.checkPlaying.call(this);
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
+ return;
+ } // If the event is bubbled from the media element
+ // Firefox doesn't get the keycode for whatever reason
- // Check for picture-in-picture support
- toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);
- // Check for airplay support
- toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);
+ if (!is.number(code)) {
+ return;
+ } // Seek by the number keys
- // Add iOS class
- toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);
- // Add touch class
- toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);
+ var seekByKey = function seekByKey() {
+ // Divide the max duration into 10th's and times by the number value
+ player.currentTime = player.duration / 10 * (code - 48);
+ }; // Handle the key on keydown
+ // Reset on keyup
- // Ready for API calls
- this.ready = true;
- // Ready event at end of execution stack
- setTimeout(function () {
- triggerEvent.call(_this, _this.media, 'ready');
- }, 0);
+ if (pressed) {
+ // Check focused element
+ // and if the focused element is not editable (e.g. text input)
+ // and any that accept key input http://webaim.org/techniques/keyboard/
+ var focused = document.activeElement;
- // Set the title
- ui.setTitle.call(this);
+ if (is.element(focused)) {
+ var editable = player.config.selectors.editable;
+ var seek = elements.inputs.seek;
- // Assure the poster image is set, if the property was added before the element was created
- if (this.poster) {
- ui.setPoster.call(this, this.poster, false).catch(function () {});
+ if (focused !== seek && matches(focused, editable)) {
+ return;
}
- // Manually set the duration if user has overridden it.
- // The event listeners for it doesn't get called if preload is disabled (#701)
- if (this.config.duration) {
- controls.durationUpdate.call(this);
+ if (event.which === 32 && matches(focused, 'button, [role^="menuitem"]')) {
+ return;
}
- },
+ } // Which keycodes should we prevent default
- // Setup aria attribute for play and iframe title
- setTitle: function setTitle() {
- // Find the current text
- var label = i18n.get('play', this.config);
+ var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows)
- // If there's a media title set, use that for the label
- if (is.string(this.config.title) && !is.empty(this.config.title)) {
- label += ', ' + this.config.title;
- }
+ if (preventDefault.includes(code)) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
- // If there's a play button, set label
- Array.from(this.elements.buttons.play || []).forEach(function (button) {
- button.setAttribute('aria-label', label);
- });
+ switch (code) {
+ case 48:
+ case 49:
+ case 50:
+ case 51:
+ case 52:
+ case 53:
+ case 54:
+ case 55:
+ case 56:
+ case 57:
+ // 0-9
+ if (!repeat) {
+ seekByKey();
+ }
+
+ break;
+
+ case 32:
+ case 75:
+ // Space and K key
+ if (!repeat) {
+ player.togglePlay();
+ }
+
+ break;
+
+ case 38:
+ // Arrow up
+ player.increaseVolume(0.1);
+ break;
+
+ case 40:
+ // Arrow down
+ player.decreaseVolume(0.1);
+ break;
+
+ case 77:
+ // M key
+ if (!repeat) {
+ player.muted = !player.muted;
+ }
+
+ break;
+
+ case 39:
+ // Arrow forward
+ player.forward();
+ break;
+
+ case 37:
+ // Arrow back
+ player.rewind();
+ break;
+
+ case 70:
+ // F key
+ player.fullscreen.toggle();
+ break;
+
+ case 67:
+ // C key
+ if (!repeat) {
+ player.toggleCaptions();
+ }
+
+ break;
+
+ case 76:
+ // L key
+ player.loop = !player.loop;
+ break;
+
+ /* case 73:
+ this.setLoop('start');
+ break;
+ case 76:
+ this.setLoop();
+ break;
+ case 79:
+ this.setLoop('end');
+ break; */
+
+ default:
+ break;
+ } // Escape is handle natively when in full screen
+ // So we only need to worry about non native
+
+
+ if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {
+ player.fullscreen.toggle();
+ } // Store last code for next cycle
+
+
+ this.lastKey = code;
+ } else {
+ this.lastKey = null;
+ }
+ } // Toggle menu
+
+ }, {
+ key: "toggleMenu",
+ value: function toggleMenu(event) {
+ controls.toggleMenu.call(this.player, event);
+ } // Device is touch enabled
+
+ }, {
+ key: "firstTouch",
+ value: function firstTouch() {
+ var player = this.player;
+ var elements = player.elements;
+ player.touch = true; // Add touch class
+
+ toggleClass(elements.container, player.config.classNames.isTouch, true);
+ }
+ }, {
+ key: "setTabFocus",
+ value: function setTabFocus(event) {
+ var player = this.player;
+ var elements = player.elements;
+ clearTimeout(this.focusTimer); // Ignore any key other than tab
- // Set iframe title
- // https://github.com/sampotts/plyr/issues/124
- if (this.isEmbed) {
- var iframe = getElement.call(this, 'iframe');
+ if (event.type === 'keydown' && event.which !== 9) {
+ return;
+ } // Store reference to event timeStamp
- if (!is.element(iframe)) {
- return;
- }
- // Default to media type
- var title = !is.empty(this.config.title) ? this.config.title : 'video';
- var format = i18n.get('frameTitle', this.config);
+ if (event.type === 'keydown') {
+ this.lastKeyDown = event.timeStamp;
+ } // Remove current classes
- iframe.setAttribute('title', format.replace('{title}', title));
- }
- },
+ var removeCurrent = function removeCurrent() {
+ var className = player.config.classNames.tabFocus;
+ var current = getElements.call(player, ".".concat(className));
+ toggleClass(current, className, false);
+ }; // Determine if a key was pressed to trigger this event
- // Toggle poster
- togglePoster: function togglePoster(enable) {
- toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
- },
+ var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
- // Set the poster image (async)
- // Used internally for the poster setter, with the passive option forced to false
- setPoster: function setPoster(poster) {
- var _this2 = this;
+ if (event.type === 'focus' && !wasKeyDown) {
+ return;
+ } // Remove all current
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- // Don't override if call is passive
- if (passive && this.poster) {
- return Promise.reject(new Error('Poster already set'));
- }
+ removeCurrent(); // Delay the adding of classname until the focus has changed
+ // This event fires before the focusin event
- // Set property synchronously to respect the call order
- this.media.setAttribute('poster', poster);
-
- // Wait until ui is ready
- return ready.call(this)
- // Load image
- .then(function () {
- return loadImage(poster);
- }).catch(function (err) {
- // Hide poster on error unless it's been set by another call
- if (poster === _this2.poster) {
- ui.togglePoster.call(_this2, false);
- }
- // Rethrow
- throw err;
- }).then(function () {
- // Prevent race conditions
- if (poster !== _this2.poster) {
- throw new Error('setPoster cancelled by later call to setPoster');
- }
- }).then(function () {
- Object.assign(_this2.elements.poster.style, {
- backgroundImage: 'url(\'' + poster + '\')',
- // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
- backgroundSize: ''
- });
- ui.togglePoster.call(_this2, true);
- return poster;
- });
- },
+ this.focusTimer = setTimeout(function () {
+ var focused = document.activeElement; // Ignore if current focus element isn't inside the player
+ if (!elements.container.contains(focused)) {
+ return;
+ }
- // Check playing state
- checkPlaying: function checkPlaying(event) {
- var _this3 = this;
+ toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
+ }, 10);
+ } // Global window & document listeners
- // Class hooks
- toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
- toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
- toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);
+ }, {
+ key: "global",
+ value: function global() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+ var player = this.player; // Keyboard shortcuts
- // Set state
- Array.from(this.elements.buttons.play || []).forEach(function (target) {
- target.pressed = _this3.playing;
- });
+ if (player.config.keyboard.global) {
+ toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
+ } // Click anywhere closes menu
- // Only update controls on non timeupdate events
- if (is.event(event) && event.type === 'timeupdate') {
- return;
- }
- // Toggle controls
- ui.toggleControls.call(this);
- },
+ toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events
+ once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
- // Check if media is loading
- checkLoading: function checkLoading(event) {
- var _this4 = this;
+ toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);
+ } // Container listeners
- this.loading = ['stalled', 'waiting'].includes(event.type);
+ }, {
+ key: "container",
+ value: function container() {
+ var player = this.player;
+ var elements = player.elements; // Keyboard shortcuts
- // Clear timer
- clearTimeout(this.timers.loading);
+ if (!player.config.keyboard.global && player.config.keyboard.focused) {
+ on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
+ } // Toggle controls on mouse events and entering fullscreen
- // Timer to prevent flicker when seeking
- this.timers.loading = setTimeout(function () {
- // Update progress bar loading class state
- toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading);
- // Update controls visibility
- ui.toggleControls.call(_this4);
- }, this.loading ? 250 : 0);
- },
+ on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
+ var controls$$1 = elements.controls; // Remove button states for fullscreen
+ if (controls$$1 && event.type === 'enterfullscreen') {
+ controls$$1.pressed = false;
+ controls$$1.hover = false;
+ } // Show, then hide after a timeout unless another control event occurs
- // Toggle controls based on state and `force` argument
- toggleControls: function toggleControls(force) {
- var controls$$1 = this.elements.controls;
+ var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
+ var delay = 0;
- if (controls$$1 && this.config.hideControls) {
- // Show controls if force, loading, paused, or button interaction, otherwise hide
- this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover));
- }
- }
- };
+ if (show) {
+ ui.toggleControls.call(player, true); // Use longer timeout for touch devices
- // ==========================================================================
+ delay = player.touch ? 3000 : 2000;
+ } // Clear timer
- var Listeners = function () {
- function Listeners(player) {
- classCallCheck(this, Listeners);
- this.player = player;
- this.lastKey = null;
- this.focusTimer = null;
- this.lastKeyDown = null;
+ clearTimeout(player.timers.controls); // Set new timer to prevent flicker when seeking
- this.handleKey = this.handleKey.bind(this);
- this.toggleMenu = this.toggleMenu.bind(this);
- this.setTabFocus = this.setTabFocus.bind(this);
- this.firstTouch = this.firstTouch.bind(this);
- }
+ player.timers.controls = setTimeout(function () {
+ return ui.toggleControls.call(player, false);
+ }, delay);
+ });
+ } // Listen for media events
+
+ }, {
+ key: "media",
+ value: function media() {
+ var player = this.player;
+ var elements = player.elements; // Time change on media
+
+ on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
+ return controls.timeUpdate.call(player, event);
+ }); // Display duration
+
+ on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {
+ return controls.durationUpdate.call(player, event);
+ }); // Check for audio tracks on load
+ // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
+
+ on.call(player, player.media, 'canplay', function () {
+ toggleHidden(elements.volume, !player.hasAudio);
+ toggleHidden(elements.buttons.mute, !player.hasAudio);
+ }); // Handle the media finishing
+
+ on.call(player, player.media, 'ended', function () {
+ // Show poster on end
+ if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {
+ // Restart
+ player.restart();
+ }
+ }); // Check for buffer progress
- // Handle key presses
+ on.call(player, player.media, 'progress playing seeking seeked', function (event) {
+ return controls.updateProgress.call(player, event);
+ }); // Handle volume changes
+ on.call(player, player.media, 'volumechange', function (event) {
+ return controls.updateVolume.call(player, event);
+ }); // Handle play/pause
- createClass(Listeners, [{
- key: 'handleKey',
- value: function handleKey(event) {
- var player = this.player;
- var elements = player.elements;
+ on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {
+ return ui.checkPlaying.call(player, event);
+ }); // Loading state
- var code = event.keyCode ? event.keyCode : event.which;
- var pressed = event.type === 'keydown';
- var repeat = pressed && code === this.lastKey;
+ on.call(player, player.media, 'waiting canplay seeked playing', function (event) {
+ return ui.checkLoading.call(player, event);
+ }); // If autoplay, then load advertisement if required
+ // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows
- // Bail if a modifier key is set
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
- return;
- }
+ on.call(player, player.media, 'playing', function () {
+ if (!player.ads) {
+ return;
+ } // If ads are enabled, wait for them first
- // If the event is bubbled from the media element
- // Firefox doesn't get the keycode for whatever reason
- if (!is.number(code)) {
- return;
- }
- // Seek by the number keys
- var seekByKey = function seekByKey() {
- // Divide the max duration into 10th's and times by the number value
- player.currentTime = player.duration / 10 * (code - 48);
- };
-
- // Handle the key on keydown
- // Reset on keyup
- if (pressed) {
- // Check focused element
- // and if the focused element is not editable (e.g. text input)
- // and any that accept key input http://webaim.org/techniques/keyboard/
- var focused = document.activeElement;
- if (is.element(focused)) {
- var editable = player.config.selectors.editable;
- var seek = elements.inputs.seek;
-
-
- if (focused !== seek && matches(focused, editable)) {
- return;
- }
-
- if (event.which === 32 && matches(focused, 'button, [role^="menuitem"]')) {
- return;
- }
- }
-
- // Which keycodes should we prevent default
- var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];
-
- // If the code is found prevent default (e.g. prevent scrolling for arrows)
- if (preventDefault.includes(code)) {
- event.preventDefault();
- event.stopPropagation();
- }
-
- switch (code) {
- case 48:
- case 49:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
- case 55:
- case 56:
- case 57:
- // 0-9
- if (!repeat) {
- seekByKey();
- }
- break;
-
- case 32:
- case 75:
- // Space and K key
- if (!repeat) {
- player.togglePlay();
- }
- break;
-
- case 38:
- // Arrow up
- player.increaseVolume(0.1);
- break;
-
- case 40:
- // Arrow down
- player.decreaseVolume(0.1);
- break;
-
- case 77:
- // M key
- if (!repeat) {
- player.muted = !player.muted;
- }
- break;
-
- case 39:
- // Arrow forward
- player.forward();
- break;
-
- case 37:
- // Arrow back
- player.rewind();
- break;
-
- case 70:
- // F key
- player.fullscreen.toggle();
- break;
-
- case 67:
- // C key
- if (!repeat) {
- player.toggleCaptions();
- }
- break;
-
- case 76:
- // L key
- player.loop = !player.loop;
- break;
-
- /* case 73:
- this.setLoop('start');
- break;
- case 76:
- this.setLoop();
- break;
- case 79:
- this.setLoop('end');
- break; */
-
- default:
- break;
- }
-
- // Escape is handle natively when in full screen
- // So we only need to worry about non native
- if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {
- player.fullscreen.toggle();
- }
-
- // Store last code for next cycle
- this.lastKey = code;
- } else {
- this.lastKey = null;
- }
- }
+ if (player.ads.enabled && !player.ads.initialized) {
+ // Wait for manager response
+ player.ads.managerPromise.then(function () {
+ return player.ads.play();
+ }).catch(function () {
+ return player.play();
+ });
+ }
+ }); // Click video
- // Toggle menu
+ if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {
+ // Re-fetch the wrapper
+ var wrapper = getElement.call(player, ".".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)
- }, {
- key: 'toggleMenu',
- value: function toggleMenu(event) {
- controls.toggleMenu.call(this.player, event);
- }
+ if (!is.element(wrapper)) {
+ return;
+ } // On click play, pause ore restart
- // Device is touch enabled
- }, {
- key: 'firstTouch',
- value: function firstTouch() {
- var player = this.player;
- var elements = player.elements;
+ on.call(player, elements.container, 'click', function (event) {
+ var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper
+ if (!targets.includes(event.target) && !wrapper.contains(event.target)) {
+ return;
+ } // Touch devices will just show controls (if hidden)
- player.touch = true;
- // Add touch class
- toggleClass(elements.container, player.config.classNames.isTouch, true);
+ if (player.touch && player.config.hideControls) {
+ return;
}
- }, {
- key: 'setTabFocus',
- value: function setTabFocus(event) {
- var player = this.player;
- var elements = player.elements;
+ if (player.ended) {
+ player.restart();
+ player.play();
+ } else {
+ player.togglePlay();
+ }
+ });
+ } // Disable right click
- clearTimeout(this.focusTimer);
- // Ignore any key other than tab
- if (event.type === 'keydown' && event.which !== 9) {
- return;
- }
+ if (player.supported.ui && player.config.disableContextMenu) {
+ on.call(player, elements.wrapper, 'contextmenu', function (event) {
+ event.preventDefault();
+ }, false);
+ } // Volume change
- // Store reference to event timeStamp
- if (event.type === 'keydown') {
- this.lastKeyDown = event.timeStamp;
- }
- // Remove current classes
- var removeCurrent = function removeCurrent() {
- var className = player.config.classNames.tabFocus;
- var current = getElements.call(player, '.' + className);
- toggleClass(current, className, false);
- };
+ on.call(player, player.media, 'volumechange', function () {
+ // Save to storage
+ player.storage.set({
+ volume: player.volume,
+ muted: player.muted
+ });
+ }); // Speed change
- // Determine if a key was pressed to trigger this event
- var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;
+ on.call(player, player.media, 'ratechange', function () {
+ // Update UI
+ controls.updateSetting.call(player, 'speed'); // Save to storage
- // Ignore focus events if a key was pressed prior
- if (event.type === 'focus' && !wasKeyDown) {
- return;
- }
- // Remove all current
- removeCurrent();
+ player.storage.set({
+ speed: player.speed
+ });
+ }); // Quality change
- // Delay the adding of classname until the focus has changed
- // This event fires before the focusin event
- this.focusTimer = setTimeout(function () {
- var focused = document.activeElement;
+ on.call(player, player.media, 'qualitychange', function (event) {
+ // Update UI
+ controls.updateSetting.call(player, 'quality', null, event.detail.quality);
+ }); // Proxy events to container
+ // Bubble up key events for Edge
- // Ignore if current focus element isn't inside the player
- if (!elements.container.contains(focused)) {
- return;
- }
+ var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');
+ on.call(player, player.media, proxyEvents, function (event) {
+ var _event$detail = event.detail,
+ detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media
- toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
- }, 10);
- }
+ if (event.type === 'error') {
+ detail = player.media.error;
+ }
- // Global window & document listeners
+ triggerEvent.call(player, elements.container, event.type, true, detail);
+ });
+ } // Run default and custom handlers
- }, {
- key: 'global',
- value: function global() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
- var player = this.player;
+ }, {
+ key: "proxy",
+ value: function proxy(event, defaultHandler, customHandlerKey) {
+ var player = this.player;
+ var customHandler = player.config.listeners[customHandlerKey];
+ var hasCustomHandler = is.function(customHandler);
+ var returned = true; // Execute custom handler
- // Keyboard shortcuts
+ if (hasCustomHandler) {
+ returned = customHandler.call(player, event);
+ } // Only call default handler if not prevented in custom handler
- if (player.config.keyboard.global) {
- toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
- }
- // Click anywhere closes menu
- toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);
+ if (returned && is.function(defaultHandler)) {
+ defaultHandler.call(player, event);
+ }
+ } // Trigger custom and default handlers
- // Detect touch by events
- once.call(player, document.body, 'touchstart', this.firstTouch);
+ }, {
+ key: "bind",
+ value: function bind(element, type, defaultHandler, customHandlerKey) {
+ var _this = this;
- // Tab focus detection
- toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);
- }
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
+ var player = this.player;
+ var customHandler = player.config.listeners[customHandlerKey];
+ var hasCustomHandler = is.function(customHandler);
+ on.call(player, element, type, function (event) {
+ return _this.proxy(event, defaultHandler, customHandlerKey);
+ }, passive && !hasCustomHandler);
+ } // Listen for control events
+
+ }, {
+ key: "controls",
+ value: function controls$$1() {
+ var _this2 = this;
- // Container listeners
+ var player = this.player;
+ var elements = player.elements; // IE doesn't support input event, so we fallback to change
- }, {
- key: 'container',
- value: function container() {
- var player = this.player;
- var elements = player.elements;
+ var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle
- // Keyboard shortcuts
+ if (elements.buttons.play) {
+ Array.from(elements.buttons.play).forEach(function (button) {
+ _this2.bind(button, 'click', player.togglePlay, 'play');
+ });
+ } // Pause
- if (!player.config.keyboard.global && player.config.keyboard.focused) {
- on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
- }
- // Toggle controls on mouse events and entering fullscreen
- on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
- var controls$$1 = elements.controls;
+ this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
- // Remove button states for fullscreen
+ this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind
- if (controls$$1 && event.type === 'enterfullscreen') {
- controls$$1.pressed = false;
- controls$$1.hover = false;
- }
+ this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle
- // Show, then hide after a timeout unless another control event occurs
- var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
+ this.bind(elements.buttons.mute, 'click', function () {
+ player.muted = !player.muted;
+ }, 'mute'); // Captions toggle
- var delay = 0;
+ this.bind(elements.buttons.captions, 'click', function () {
+ return player.toggleCaptions();
+ }); // Fullscreen toggle
- if (show) {
- ui.toggleControls.call(player, true);
- // Use longer timeout for touch devices
- delay = player.touch ? 3000 : 2000;
- }
+ this.bind(elements.buttons.fullscreen, 'click', function () {
+ player.fullscreen.toggle();
+ }, 'fullscreen'); // Picture-in-Picture
- // Clear timer
- clearTimeout(player.timers.controls);
+ this.bind(elements.buttons.pip, 'click', function () {
+ player.pip = 'toggle';
+ }, 'pip'); // Airplay
- // Set new timer to prevent flicker when seeking
- player.timers.controls = setTimeout(function () {
- return ui.toggleControls.call(player, false);
- }, delay);
- });
- }
+ this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle
- // Listen for media events
+ this.bind(elements.buttons.settings, 'click', function (event) {
+ // Prevent the document click listener closing the menu
+ event.stopPropagation();
- }, {
- key: 'media',
- value: function media() {
- var player = this.player;
- var elements = player.elements;
+ controls.toggleMenu.call(player, event);
+ }); // Settings menu - keyboard toggle
+ // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
- // Time change on media
+ this.bind(elements.buttons.settings, 'keyup', function (event) {
+ var code = event.which; // We only care about space and return
- on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
- return controls.timeUpdate.call(player, event);
- });
+ if (![13, 32].includes(code)) {
+ return;
+ } // Because return triggers a click anyway, all we need to do is set focus
- // Display duration
- on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {
- return controls.durationUpdate.call(player, event);
- });
- // Check for audio tracks on load
- // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
- on.call(player, player.media, 'canplay', function () {
- toggleHidden(elements.volume, !player.hasAudio);
- toggleHidden(elements.buttons.mute, !player.hasAudio);
- });
+ if (code === 13) {
+ controls.focusFirstMenuItem.call(player, null, true);
- // Handle the media finishing
- on.call(player, player.media, 'ended', function () {
- // Show poster on end
- if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {
- // Restart
- player.restart();
- }
- });
+ return;
+ } // Prevent scroll
- // Check for buffer progress
- on.call(player, player.media, 'progress playing seeking seeked', function (event) {
- return controls.updateProgress.call(player, event);
- });
- // Handle volume changes
- on.call(player, player.media, 'volumechange', function (event) {
- return controls.updateVolume.call(player, event);
- });
+ event.preventDefault(); // Prevent playing video (Firefox)
- // Handle play/pause
- on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {
- return ui.checkPlaying.call(player, event);
- });
+ event.stopPropagation(); // Toggle menu
- // Loading state
- on.call(player, player.media, 'waiting canplay seeked playing', function (event) {
- return ui.checkLoading.call(player, event);
- });
+ controls.toggleMenu.call(player, event);
+ }, null, false // Can't be passive as we're preventing default
+ ); // Escape closes menu
- // If autoplay, then load advertisement if required
- // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows
- on.call(player, player.media, 'playing', function () {
- if (!player.ads) {
- return;
- }
-
- // If ads are enabled, wait for them first
- if (player.ads.enabled && !player.ads.initialized) {
- // Wait for manager response
- player.ads.managerPromise.then(function () {
- return player.ads.play();
- }).catch(function () {
- return player.play();
- });
- }
- });
+ this.bind(elements.settings.menu, 'keydown', function (event) {
+ if (event.which === 27) {
+ controls.toggleMenu.call(player, event);
+ }
+ }); // Set range input alternative "value", which matches the tooltip time (#954)
- // Click video
- if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {
- // Re-fetch the wrapper
- var wrapper = getElement.call(player, '.' + player.config.classNames.video);
-
- // Bail if there's no wrapper (this should never happen)
- if (!is.element(wrapper)) {
- return;
- }
-
- // On click play, pause ore restart
- on.call(player, elements.container, 'click', function (event) {
- var targets = [elements.container, wrapper];
-
- // Ignore if click if not container or in video wrapper
- if (!targets.includes(event.target) && !wrapper.contains(event.target)) {
- return;
- }
-
- // Touch devices will just show controls (if hidden)
- if (player.touch && player.config.hideControls) {
- return;
- }
-
- if (player.ended) {
- player.restart();
- player.play();
- } else {
- player.togglePlay();
- }
- });
- }
+ this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {
+ var rect = elements.progress.getBoundingClientRect();
+ var percent = 100 / rect.width * (event.pageX - rect.left);
+ event.currentTarget.setAttribute('seek-value', percent);
+ }); // Pause while seeking
- // Disable right click
- if (player.supported.ui && player.config.disableContextMenu) {
- on.call(player, elements.wrapper, 'contextmenu', function (event) {
- event.preventDefault();
- }, false);
- }
+ this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
+ var seek = event.currentTarget;
+ var code = event.keyCode ? event.keyCode : event.which;
+ var attribute = 'play-on-seeked';
- // Volume change
- on.call(player, player.media, 'volumechange', function () {
- // Save to storage
- player.storage.set({
- volume: player.volume,
- muted: player.muted
- });
- });
+ if (is.keyboardEvent(event) && code !== 39 && code !== 37) {
+ return;
+ } // Was playing before?
- // Speed change
- on.call(player, player.media, 'ratechange', function () {
- // Update UI
- controls.updateSetting.call(player, 'speed');
- // Save to storage
- player.storage.set({ speed: player.speed });
- });
+ var play = seek.hasAttribute(attribute); // Done seeking
- // Quality change
- on.call(player, player.media, 'qualitychange', function (event) {
- // Update UI
- controls.updateSetting.call(player, 'quality', null, event.detail.quality);
- });
+ var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback
- // Proxy events to container
- // Bubble up key events for Edge
- var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');
+ if (play && done) {
+ seek.removeAttribute(attribute);
+ player.play();
+ } else if (!done && player.playing) {
+ seek.setAttribute(attribute, '');
+ player.pause();
+ }
+ }); // Fix range inputs on iOS
+ // Super weird iOS bug where after you interact with an <input type="range">,
+ // it takes over further interactions on the page. This is a hack
+
+ if (browser.isIos) {
+ var inputs = getElements.call(player, 'input[type="range"]');
+ Array.from(inputs).forEach(function (input) {
+ return _this2.bind(input, inputEvent, function (event) {
+ return repaint(event.target);
+ });
+ });
+ } // Seek
- on.call(player, player.media, proxyEvents, function (event) {
- var _event$detail = event.detail,
- detail = _event$detail === undefined ? {} : _event$detail;
- // Get error details from media
+ this.bind(elements.inputs.seek, inputEvent, function (event) {
+ var seek = event.currentTarget; // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
- if (event.type === 'error') {
- detail = player.media.error;
- }
+ var seekTo = seek.getAttribute('seek-value');
- triggerEvent.call(player, elements.container, event.type, true, detail);
- });
- }
+ if (is.empty(seekTo)) {
+ seekTo = seek.value;
+ }
- // Run default and custom handlers
+ seek.removeAttribute('seek-value');
+ player.currentTime = seekTo / seek.max * player.duration;
+ }, 'seek'); // Seek tooltip
- }, {
- key: 'proxy',
- value: function proxy(event, defaultHandler, customHandlerKey) {
- var player = this.player;
+ this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
+ return controls.updateSeekTooltip.call(player, event);
+ }); // Polyfill for lower fill in <input type="range"> for webkit
- var customHandler = player.config.listeners[customHandlerKey];
- var hasCustomHandler = is.function(customHandler);
- var returned = true;
+ if (browser.isWebkit) {
+ Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
+ _this2.bind(element, 'input', function (event) {
+ return controls.updateRangeFill.call(player, event.target);
+ });
+ });
+ } // Current time invert
+ // Only if one time element is used for both currentTime and duration
- // Execute custom handler
- if (hasCustomHandler) {
- returned = customHandler.call(player, event);
- }
- // Only call default handler if not prevented in custom handler
- if (returned && is.function(defaultHandler)) {
- defaultHandler.call(player, event);
- }
+ if (player.config.toggleInvert && !is.element(elements.display.duration)) {
+ this.bind(elements.display.currentTime, 'click', function () {
+ // Do nothing if we're at the start
+ if (player.currentTime === 0) {
+ return;
}
- // Trigger custom and default handlers
+ player.config.invertTime = !player.config.invertTime;
- }, {
- key: 'bind',
- value: function bind(element, type, defaultHandler, customHandlerKey) {
- var _this = this;
+ controls.timeUpdate.call(player);
+ });
+ } // Volume
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var player = this.player;
- var customHandler = player.config.listeners[customHandlerKey];
- var hasCustomHandler = is.function(customHandler);
+ this.bind(elements.inputs.volume, inputEvent, function (event) {
+ player.volume = event.target.value;
+ }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
- on.call(player, element, type, function (event) {
- return _this.proxy(event, defaultHandler, customHandlerKey);
- }, passive && !hasCustomHandler);
- }
+ this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
+ elements.controls.hover = !player.touch && event.type === 'mouseenter';
+ }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
- // Listen for control events
+ this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
+ elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
+ }); // Focus in/out on controls
- }, {
- key: 'controls',
- value: function controls$$1() {
- var _this2 = this;
+ this.bind(elements.controls, 'focusin focusout', function (event) {
+ var config = player.config,
+ elements = player.elements,
+ timers = player.timers;
+ var isFocusIn = event.type === 'focusin'; // Skip transition to prevent focus from scrolling the parent element
- var player = this.player;
- var elements = player.elements;
+ toggleClass(elements.controls, config.classNames.noTransition, isFocusIn); // Toggle
- // IE doesn't support input event, so we fallback to change
-
- var inputEvent = browser.isIE ? 'change' : 'input';
-
- // Play/pause toggle
- if (elements.buttons.play) {
- Array.from(elements.buttons.play).forEach(function (button) {
- _this2.bind(button, 'click', player.togglePlay, 'play');
- });
- }
+ ui.toggleControls.call(player, isFocusIn); // If focusin, hide again after delay
- // Pause
- this.bind(elements.buttons.restart, 'click', player.restart, 'restart');
+ if (isFocusIn) {
+ // Restore transition
+ setTimeout(function () {
+ toggleClass(elements.controls, config.classNames.noTransition, false);
+ }, 0); // Delay a little more for keyboard users
- // Rewind
- this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');
+ var delay = _this2.touch ? 3000 : 4000; // Clear timer
- // Rewind
- this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');
+ clearTimeout(timers.controls); // Hide
- // Mute toggle
- this.bind(elements.buttons.mute, 'click', function () {
- player.muted = !player.muted;
- }, 'mute');
+ timers.controls = setTimeout(function () {
+ return ui.toggleControls.call(player, false);
+ }, delay);
+ }
+ }); // Mouse wheel for volume
- // Captions toggle
- this.bind(elements.buttons.captions, 'click', function () {
- return player.toggleCaptions();
- });
+ this.bind(elements.inputs.volume, 'wheel', function (event) {
+ // Detect "natural" scroll - suppored on OS X Safari only
+ // Other browsers on OS X will be inverted until support improves
+ var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true
- // Fullscreen toggle
- this.bind(elements.buttons.fullscreen, 'click', function () {
- player.fullscreen.toggle();
- }, 'fullscreen');
+ var _map = [event.deltaX, -event.deltaY].map(function (value) {
+ return inverted ? -value : value;
+ }),
+ _map2 = _slicedToArray(_map, 2),
+ x = _map2[0],
+ y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)
- // Picture-in-Picture
- this.bind(elements.buttons.pip, 'click', function () {
- player.pip = 'toggle';
- }, 'pip');
- // Airplay
- this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');
+ var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%
- // Settings menu - click toggle
- this.bind(elements.buttons.settings, 'click', function (event) {
- // Prevent the document click listener closing the menu
- event.stopPropagation();
+ player.increaseVolume(direction / 50); // Don't break page scrolling at max and min
- controls.toggleMenu.call(player, event);
- });
+ var volume = player.media.volume;
- // Settings menu - keyboard toggle
- // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
- this.bind(elements.buttons.settings, 'keyup', function (event) {
- var code = event.which;
-
- // We only care about space and return
- if (![13, 32].includes(code)) {
- return;
- }
-
- // Because return triggers a click anyway, all we need to do is set focus
- if (code === 13) {
- controls.focusFirstMenuItem.call(player, null, true);
- return;
- }
-
- // Prevent scroll
- event.preventDefault();
-
- // Prevent playing video (Firefox)
- event.stopPropagation();
-
- // Toggle menu
- controls.toggleMenu.call(player, event);
- }, null, false // Can't be passive as we're preventing default
- );
-
- // Escape closes menu
- this.bind(elements.settings.menu, 'keydown', function (event) {
- if (event.which === 27) {
- controls.toggleMenu.call(player, event);
- }
- });
+ if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {
+ event.preventDefault();
+ }
+ }, 'volume', false);
+ }
+ }]);
- // Set range input alternative "value", which matches the tooltip time (#954)
- this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {
- var rect = elements.progress.getBoundingClientRect();
- var percent = 100 / rect.width * (event.pageX - rect.left);
- event.currentTarget.setAttribute('seek-value', percent);
- });
+ return Listeners;
+ }();
- // Pause while seeking
- this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
- var seek = event.currentTarget;
- var code = event.keyCode ? event.keyCode : event.which;
- var attribute = 'play-on-seeked';
-
- if (is.keyboardEvent(event) && code !== 39 && code !== 37) {
- return;
- }
-
- // Was playing before?
- var play = seek.hasAttribute(attribute);
-
- // Done seeking
- var done = ['mouseup', 'touchend', 'keyup'].includes(event.type);
-
- // If we're done seeking and it was playing, resume playback
- if (play && done) {
- seek.removeAttribute(attribute);
- player.play();
- } else if (!done && player.playing) {
- seek.setAttribute(attribute, '');
- player.pause();
- }
- });
+ var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
- // Fix range inputs on iOS
- // Super weird iOS bug where after you interact with an <input type="range">,
- // it takes over further interactions on the page. This is a hack
- if (browser.isIos) {
- var inputs = getElements.call(player, 'input[type="range"]');
- Array.from(inputs).forEach(function (input) {
- return _this2.bind(input, inputEvent, function (event) {
- return repaint(event.target);
- });
- });
- }
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
- // Seek
- this.bind(elements.inputs.seek, inputEvent, function (event) {
- var seek = event.currentTarget;
+ var loadjs_umd = createCommonjsModule(function (module, exports) {
+ (function(root, factory) {
+ if (typeof undefined === 'function' && undefined.amd) {
+ undefined([], factory);
+ } else {
+ module.exports = factory();
+ }
+ }(commonjsGlobal, function() {
+ /**
+ * Global dependencies.
+ * @global {Object} document - DOM
+ */
+
+ var devnull = function() {},
+ bundleIdCache = {},
+ bundleResultCache = {},
+ bundleCallbackQueue = {};
- // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
- var seekTo = seek.getAttribute('seek-value');
- if (is.empty(seekTo)) {
- seekTo = seek.value;
- }
+ /**
+ * Subscribe to bundle load event.
+ * @param {string[]} bundleIds - Bundle ids
+ * @param {Function} callbackFn - The callback function
+ */
+ function subscribe(bundleIds, callbackFn) {
+ // listify
+ bundleIds = bundleIds.push ? bundleIds : [bundleIds];
+
+ var depsNotFound = [],
+ i = bundleIds.length,
+ numWaiting = i,
+ fn,
+ bundleId,
+ r,
+ q;
+
+ // define callback function
+ fn = function (bundleId, pathsNotFound) {
+ if (pathsNotFound.length) depsNotFound.push(bundleId);
+
+ numWaiting--;
+ if (!numWaiting) callbackFn(depsNotFound);
+ };
- seek.removeAttribute('seek-value');
+ // register callback
+ while (i--) {
+ bundleId = bundleIds[i];
- player.currentTime = seekTo / seek.max * player.duration;
- }, 'seek');
+ // execute callback if in result cache
+ r = bundleResultCache[bundleId];
+ if (r) {
+ fn(bundleId, r);
+ continue;
+ }
- // Seek tooltip
- this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
- return controls.updateSeekTooltip.call(player, event);
- });
+ // add to callback queue
+ q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
+ q.push(fn);
+ }
+ }
- // Polyfill for lower fill in <input type="range"> for webkit
- if (browser.isWebkit) {
- Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
- _this2.bind(element, 'input', function (event) {
- return controls.updateRangeFill.call(player, event.target);
- });
- });
- }
- // Current time invert
- // Only if one time element is used for both currentTime and duration
- if (player.config.toggleInvert && !is.element(elements.display.duration)) {
- this.bind(elements.display.currentTime, 'click', function () {
- // Do nothing if we're at the start
- if (player.currentTime === 0) {
- return;
- }
+ /**
+ * Publish bundle load event.
+ * @param {string} bundleId - Bundle id
+ * @param {string[]} pathsNotFound - List of files not found
+ */
+ function publish(bundleId, pathsNotFound) {
+ // exit if id isn't defined
+ if (!bundleId) return;
- player.config.invertTime = !player.config.invertTime;
+ var q = bundleCallbackQueue[bundleId];
- controls.timeUpdate.call(player);
- });
- }
+ // cache result
+ bundleResultCache[bundleId] = pathsNotFound;
- // Volume
- this.bind(elements.inputs.volume, inputEvent, function (event) {
- player.volume = event.target.value;
- }, 'volume');
+ // exit if queue is empty
+ if (!q) return;
- // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
- this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
- elements.controls.hover = !player.touch && event.type === 'mouseenter';
- });
+ // empty callback queue
+ while (q.length) {
+ q[0](bundleId, pathsNotFound);
+ q.splice(0, 1);
+ }
+ }
+
+
+ /**
+ * Execute callbacks.
+ * @param {Object or Function} args - The callback args
+ * @param {string[]} depsNotFound - List of dependencies not found
+ */
+ function executeCallbacks(args, depsNotFound) {
+ // accept function as argument
+ if (args.call) args = {success: args};
+
+ // success and error callbacks
+ if (depsNotFound.length) (args.error || devnull)(depsNotFound);
+ else (args.success || devnull)(args);
+ }
+
+
+ /**
+ * Load individual file.
+ * @param {string} path - The file path
+ * @param {Function} callbackFn - The callback function
+ */
+ function loadFile(path, callbackFn, args, numTries) {
+ var doc = document,
+ async = args.async,
+ maxTries = (args.numRetries || 0) + 1,
+ beforeCallbackFn = args.before || devnull,
+ pathStripped = path.replace(/^(css|img)!/, ''),
+ isCss,
+ e;
+
+ numTries = numTries || 0;
+
+ if (/(^css!|\.css$)/.test(path)) {
+ isCss = true;
+
+ // css
+ e = doc.createElement('link');
+ e.rel = 'stylesheet';
+ e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
+ } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
+ // image
+ e = doc.createElement('img');
+ e.src = pathStripped;
+ } else {
+ // javascript
+ e = doc.createElement('script');
+ e.src = path;
+ e.async = async === undefined ? true : async;
+ }
- // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
- this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
- elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
- });
+ e.onload = e.onerror = e.onbeforeload = function (ev) {
+ var result = ev.type[0];
- // Focus in/out on controls
- this.bind(elements.controls, 'focusin focusout', function (event) {
- var config = player.config,
- elements = player.elements,
- timers = player.timers;
+ // Note: The following code isolates IE using `hideFocus` and treats empty
+ // stylesheets as failures to get around lack of onerror support
+ if (isCss && 'hideFocus' in e) {
+ try {
+ if (!e.sheet.cssText.length) result = 'e';
+ } catch (x) {
+ // sheets objects created from load errors don't allow access to
+ // `cssText`
+ result = 'e';
+ }
+ }
- var isFocusIn = event.type === 'focusin';
+ // handle retries in case of load failure
+ if (result == 'e') {
+ // increment counter
+ numTries += 1;
- // Skip transition to prevent focus from scrolling the parent element
- toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);
+ // exit function and try again
+ if (numTries < maxTries) {
+ return loadFile(path, callbackFn, args, numTries);
+ }
+ }
- // Toggle
- ui.toggleControls.call(player, isFocusIn);
+ // execute callback
+ callbackFn(path, result, ev.defaultPrevented);
+ };
- // If focusin, hide again after delay
- if (isFocusIn) {
- // Restore transition
- setTimeout(function () {
- toggleClass(elements.controls, config.classNames.noTransition, false);
- }, 0);
+ // add to document (unless callback returns `false`)
+ if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
+ }
+
+
+ /**
+ * Load multiple files.
+ * @param {string[]} paths - The file paths
+ * @param {Function} callbackFn - The callback function
+ */
+ function loadFiles(paths, callbackFn, args) {
+ // listify paths
+ paths = paths.push ? paths : [paths];
+
+ var numWaiting = paths.length,
+ x = numWaiting,
+ pathsNotFound = [],
+ fn,
+ i;
+
+ // define callback function
+ fn = function(path, result, defaultPrevented) {
+ // handle error
+ if (result == 'e') pathsNotFound.push(path);
+
+ // handle beforeload event. If defaultPrevented then that means the load
+ // will be blocked (ex. Ghostery/ABP on Safari)
+ if (result == 'b') {
+ if (defaultPrevented) pathsNotFound.push(path);
+ else return;
+ }
- // Delay a little more for keyboard users
- var delay = _this2.touch ? 3000 : 4000;
+ numWaiting--;
+ if (!numWaiting) callbackFn(pathsNotFound);
+ };
- // Clear timer
- clearTimeout(timers.controls);
+ // load scripts
+ for (i=0; i < x; i++) loadFile(paths[i], fn, args);
+ }
- // Hide
- timers.controls = setTimeout(function () {
- return ui.toggleControls.call(player, false);
- }, delay);
- }
- });
- // Mouse wheel for volume
- this.bind(elements.inputs.volume, 'wheel', function (event) {
- // Detect "natural" scroll - suppored on OS X Safari only
- // Other browsers on OS X will be inverted until support improves
- var inverted = event.webkitDirectionInvertedFromDevice;
+ /**
+ * Initiate script load and register bundle.
+ * @param {(string|string[])} paths - The file paths
+ * @param {(string|Function)} [arg1] - The bundleId or success callback
+ * @param {Function} [arg2] - The success or error callback
+ * @param {Function} [arg3] - The error callback
+ */
+ function loadjs(paths, arg1, arg2) {
+ var bundleId,
+ args;
- // Get delta from event. Invert if `inverted` is true
+ // bundleId (if string)
+ if (arg1 && arg1.trim) bundleId = arg1;
- var _map = [event.deltaX, -event.deltaY].map(function (value) {
- return inverted ? -value : value;
- }),
- _map2 = slicedToArray(_map, 2),
- x = _map2[0],
- y = _map2[1];
+ // args (default is {})
+ args = (bundleId ? arg2 : arg1) || {};
- // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)
+ // throw error if bundle is already defined
+ if (bundleId) {
+ if (bundleId in bundleIdCache) {
+ throw "LoadJS";
+ } else {
+ bundleIdCache[bundleId] = true;
+ }
+ }
+ // load scripts
+ loadFiles(paths, function (pathsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, pathsNotFound);
+
+ // publish bundle load event
+ publish(bundleId, pathsNotFound);
+ }, args);
+ }
+
+
+ /**
+ * Execute callbacks when dependencies have been satisfied.
+ * @param {(string|string[])} deps - List of bundle ids
+ * @param {Object} args - success/error arguments
+ */
+ loadjs.ready = function ready(deps, args) {
+ // subscribe to bundle load event
+ subscribe(deps, function (depsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, depsNotFound);
+ });
- var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);
+ return loadjs;
+ };
- // Change the volume by 2%
- player.increaseVolume(direction / 50);
- // Don't break page scrolling at max and min
- var volume = player.media.volume;
+ /**
+ * Manually satisfy bundle dependencies.
+ * @param {string} bundleId - The bundle id
+ */
+ loadjs.done = function done(bundleId) {
+ publish(bundleId, []);
+ };
- if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {
- event.preventDefault();
- }
- }, 'volume', false);
- }
- }]);
- return Listeners;
- }();
- var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+ /**
+ * Reset loadjs dependencies statuses
+ */
+ loadjs.reset = function reset() {
+ bundleIdCache = {};
+ bundleResultCache = {};
+ bundleCallbackQueue = {};
+ };
- function createCommonjsModule(fn, module) {
- return module = { exports: {} }, fn(module, module.exports), module.exports;
- }
- var loadjs_umd = createCommonjsModule(function (module, exports) {
- (function(root, factory) {
- if (typeof undefined === 'function' && undefined.amd) {
- undefined([], factory);
- } else {
- module.exports = factory();
- }
- }(commonjsGlobal, function() {
- /**
- * Global dependencies.
- * @global {Object} document - DOM
- */
+ /**
+ * Determine if bundle has already been defined
+ * @param String} bundleId - The bundle id
+ */
+ loadjs.isDefined = function isDefined(bundleId) {
+ return bundleId in bundleIdCache;
+ };
- var devnull = function() {},
- bundleIdCache = {},
- bundleResultCache = {},
- bundleCallbackQueue = {};
+ // export
+ return loadjs;
- /**
- * Subscribe to bundle load event.
- * @param {string[]} bundleIds - Bundle ids
- * @param {Function} callbackFn - The callback function
- */
- function subscribe(bundleIds, callbackFn) {
- // listify
- bundleIds = bundleIds.push ? bundleIds : [bundleIds];
-
- var depsNotFound = [],
- i = bundleIds.length,
- numWaiting = i,
- fn,
- bundleId,
- r,
- q;
-
- // define callback function
- fn = function (bundleId, pathsNotFound) {
- if (pathsNotFound.length) depsNotFound.push(bundleId);
-
- numWaiting--;
- if (!numWaiting) callbackFn(depsNotFound);
- };
+ }));
+ });
- // register callback
- while (i--) {
- bundleId = bundleIds[i];
+ // ==========================================================================
+ function loadScript(url) {
+ return new Promise(function (resolve, reject) {
+ loadjs_umd(url, {
+ success: resolve,
+ error: reject
+ });
+ });
+ }
- // execute callback if in result cache
- r = bundleResultCache[bundleId];
- if (r) {
- fn(bundleId, r);
- continue;
- }
+ function parseId(url) {
+ if (is.empty(url)) {
+ return null;
+ }
- // add to callback queue
- q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
- q.push(fn);
- }
+ if (is.number(Number(url))) {
+ return url;
}
+ var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+ } // Get aspect ratio for dimensions
- /**
- * Publish bundle load event.
- * @param {string} bundleId - Bundle id
- * @param {string[]} pathsNotFound - List of files not found
- */
- function publish(bundleId, pathsNotFound) {
- // exit if id isn't defined
- if (!bundleId) return;
- var q = bundleCallbackQueue[bundleId];
+ function getAspectRatio(width, height) {
+ var getRatio = function getRatio(w, h) {
+ return h === 0 ? w : getRatio(h, w % h);
+ };
- // cache result
- bundleResultCache[bundleId] = pathsNotFound;
+ var ratio = getRatio(width, height);
+ return "".concat(width / ratio, ":").concat(height / ratio);
+ } // Set playback state and trigger change (only on actual change)
- // exit if queue is empty
- if (!q) return;
- // empty callback queue
- while (q.length) {
- q[0](bundleId, pathsNotFound);
- q.splice(0, 1);
- }
+ function assurePlaybackState(play) {
+ if (play && !this.embed.hasPlayed) {
+ this.embed.hasPlayed = true;
}
+ if (this.media.paused === play) {
+ this.media.paused = !play;
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
+ }
+ }
- /**
- * Execute callbacks.
- * @param {Object or Function} args - The callback args
- * @param {string[]} depsNotFound - List of dependencies not found
- */
- function executeCallbacks(args, depsNotFound) {
- // accept function as argument
- if (args.call) args = {success: args};
+ var vimeo = {
+ setup: function setup() {
+ var _this = this;
- // success and error callbacks
- if (depsNotFound.length) (args.error || devnull)(depsNotFound);
- else (args.success || devnull)(args);
- }
+ // Add embed class for responsive
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio
+ vimeo.setAspectRatio.call(this); // Load the API if not already
- /**
- * Load individual file.
- * @param {string} path - The file path
- * @param {Function} callbackFn - The callback function
- */
- function loadFile(path, callbackFn, args, numTries) {
- var doc = document,
- async = args.async,
- maxTries = (args.numRetries || 0) + 1,
- beforeCallbackFn = args.before || devnull,
- pathStripped = path.replace(/^(css|img)!/, ''),
- isCss,
- e;
-
- numTries = numTries || 0;
-
- if (/(^css!|\.css$)/.test(path)) {
- isCss = true;
-
- // css
- e = doc.createElement('link');
- e.rel = 'stylesheet';
- e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
- } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
- // image
- e = doc.createElement('img');
- e.src = pathStripped;
+ if (!is.object(window.Vimeo)) {
+ loadScript(this.config.urls.vimeo.sdk).then(function () {
+ vimeo.ready.call(_this);
+ }).catch(function (error) {
+ _this.debug.warn('Vimeo API failed to load', error);
+ });
} else {
- // javascript
- e = doc.createElement('script');
- e.src = path;
- e.async = async === undefined ? true : async;
+ vimeo.ready.call(this);
}
-
- e.onload = e.onerror = e.onbeforeload = function (ev) {
- var result = ev.type[0];
-
- // Note: The following code isolates IE using `hideFocus` and treats empty
- // stylesheets as failures to get around lack of onerror support
- if (isCss && 'hideFocus' in e) {
- try {
- if (!e.sheet.cssText.length) result = 'e';
- } catch (x) {
- // sheets objects created from load errors don't allow access to
- // `cssText`
- result = 'e';
- }
- }
-
- // handle retries in case of load failure
- if (result == 'e') {
- // increment counter
- numTries += 1;
-
- // exit function and try again
- if (numTries < maxTries) {
- return loadFile(path, callbackFn, args, numTries);
- }
- }
-
- // execute callback
- callbackFn(path, result, ev.defaultPrevented);
+ },
+ // Set aspect ratio
+ // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI
+ setAspectRatio: function setAspectRatio(input) {
+ var _split = (is.string(input) ? input : this.config.ratio).split(':'),
+ _split2 = _slicedToArray(_split, 2),
+ x = _split2[0],
+ y = _split2[1];
+
+ var padding = 100 / x * y;
+ this.elements.wrapper.style.paddingBottom = "".concat(padding, "%");
+
+ if (this.supported.ui) {
+ var height = 240;
+ var offset = (height - padding) / (height / 50);
+ this.media.style.transform = "translateY(-".concat(offset, "%)");
+ }
+ },
+ // API Ready
+ ready: function ready$$1() {
+ var _this2 = this;
+
+ var player = this; // Get Vimeo params for the iframe
+
+ var options = {
+ loop: player.config.loop.active,
+ autoplay: player.autoplay,
+ // muted: player.muted,
+ byline: false,
+ portrait: false,
+ title: false,
+ speed: true,
+ transparent: 0,
+ gesture: 'media',
+ playsinline: !this.config.fullscreen.iosNative
};
+ var params = buildUrlParams(options); // Get the source URL or ID
- // add to document (unless callback returns `false`)
- if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
- }
+ var source = player.media.getAttribute('src'); // Get from <div> if needed
+ if (is.empty(source)) {
+ source = player.media.getAttribute(player.config.attributes.embed.id);
+ }
- /**
- * Load multiple files.
- * @param {string[]} paths - The file paths
- * @param {Function} callbackFn - The callback function
- */
- function loadFiles(paths, callbackFn, args) {
- // listify paths
- paths = paths.push ? paths : [paths];
-
- var numWaiting = paths.length,
- x = numWaiting,
- pathsNotFound = [],
- fn,
- i;
-
- // define callback function
- fn = function(path, result, defaultPrevented) {
- // handle error
- if (result == 'e') pathsNotFound.push(path);
-
- // handle beforeload event. If defaultPrevented then that means the load
- // will be blocked (ex. Ghostery/ABP on Safari)
- if (result == 'b') {
- if (defaultPrevented) pathsNotFound.push(path);
- else return;
- }
-
- numWaiting--;
- if (!numWaiting) callbackFn(pathsNotFound);
- };
+ var id = parseId(source); // Build an iframe
- // load scripts
- for (i=0; i < x; i++) loadFile(paths[i], fn, args);
- }
+ var iframe = createElement('iframe');
+ var src = format(player.config.urls.vimeo.iframe, id, params);
+ iframe.setAttribute('src', src);
+ iframe.setAttribute('allowfullscreen', '');
+ iframe.setAttribute('allowtransparency', '');
+ iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set
+ var poster = player.poster; // Inject the package
- /**
- * Initiate script load and register bundle.
- * @param {(string|string[])} paths - The file paths
- * @param {(string|Function)} [arg1] - The bundleId or success callback
- * @param {Function} [arg2] - The success or error callback
- * @param {Function} [arg3] - The error callback
- */
- function loadjs(paths, arg1, arg2) {
- var bundleId,
- args;
-
- // bundleId (if string)
- if (arg1 && arg1.trim) bundleId = arg1;
+ var wrapper = createElement('div', {
+ poster: poster,
+ class: player.config.classNames.embedContainer
+ });
+ wrapper.appendChild(iframe);
+ player.media = replaceElement(wrapper, player.media); // Get poster image
- // args (default is {})
- args = (bundleId ? arg2 : arg1) || {};
+ fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
+ if (is.empty(response)) {
+ return;
+ } // Get the URL for thumbnail
- // throw error if bundle is already defined
- if (bundleId) {
- if (bundleId in bundleIdCache) {
- throw "LoadJS";
- } else {
- bundleIdCache[bundleId] = true;
- }
- }
- // load scripts
- loadFiles(paths, function (pathsNotFound) {
- // execute callbacks
- executeCallbacks(args, pathsNotFound);
+ var url = new URL(response[0].thumbnail_large); // Get original image
- // publish bundle load event
- publish(bundleId, pathsNotFound);
- }, args);
- }
+ url.pathname = "".concat(url.pathname.split('_')[0], ".jpg"); // Set and show poster
+ ui.setPoster.call(player, url.href).catch(function () {});
+ }); // Setup instance
+ // https://github.com/vimeo/player.js
- /**
- * Execute callbacks when dependencies have been satisfied.
- * @param {(string|string[])} deps - List of bundle ids
- * @param {Object} args - success/error arguments
- */
- loadjs.ready = function ready(deps, args) {
- // subscribe to bundle load event
- subscribe(deps, function (depsNotFound) {
- // execute callbacks
- executeCallbacks(args, depsNotFound);
+ player.embed = new window.Vimeo.Player(iframe, {
+ autopause: player.config.autopause,
+ muted: player.muted
});
+ player.media.paused = true;
+ player.media.currentTime = 0; // Disable native text track rendering
- return loadjs;
- };
-
-
- /**
- * Manually satisfy bundle dependencies.
- * @param {string} bundleId - The bundle id
- */
- loadjs.done = function done(bundleId) {
- publish(bundleId, []);
- };
+ if (player.supported.ui) {
+ player.embed.disableTextTrack();
+ } // Create a faux HTML5 API using the Vimeo API
- /**
- * Reset loadjs dependencies statuses
- */
- loadjs.reset = function reset() {
- bundleIdCache = {};
- bundleResultCache = {};
- bundleCallbackQueue = {};
- };
+ player.media.play = function () {
+ assurePlaybackState.call(player, true);
+ return player.embed.play();
+ };
+ player.media.pause = function () {
+ assurePlaybackState.call(player, false);
+ return player.embed.pause();
+ };
- /**
- * Determine if bundle has already been defined
- * @param String} bundleId - The bundle id
- */
- loadjs.isDefined = function isDefined(bundleId) {
- return bundleId in bundleIdCache;
- };
+ player.media.stop = function () {
+ player.pause();
+ player.currentTime = 0;
+ }; // Seeking
- // export
- return loadjs;
+ var currentTime = player.media.currentTime;
+ Object.defineProperty(player.media, 'currentTime', {
+ get: function get() {
+ return currentTime;
+ },
+ set: function set(time) {
+ // Vimeo will automatically play on seek if the video hasn't been played before
+ // Get current paused state and volume etc
+ var embed = player.embed,
+ media = player.media,
+ paused = player.paused,
+ volume = player.volume;
+ var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event
+
+ media.seeking = true;
+ triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete
+
+ Promise.resolve(restorePause && embed.setVolume(0)) // Seek
+ .then(function () {
+ return embed.setCurrentTime(time);
+ }) // Restore paused
+ .then(function () {
+ return restorePause && embed.pause();
+ }) // Restore volume
+ .then(function () {
+ return restorePause && embed.setVolume(volume);
+ }).catch(function () {// Do nothing
+ });
+ }
+ }); // Playback speed
- }));
- });
+ var speed = player.config.speed.selected;
+ Object.defineProperty(player.media, 'playbackRate', {
+ get: function get() {
+ return speed;
+ },
+ set: function set(input) {
+ player.embed.setPlaybackRate(input).then(function () {
+ speed = input;
+ triggerEvent.call(player, player.media, 'ratechange');
+ }).catch(function (error) {
+ // Hide menu item (and menu if empty)
+ if (error.name === 'Error') {
+ controls.setSpeedMenu.call(player, []);
+ }
+ });
+ }
+ }); // Volume
- // ==========================================================================
+ var volume = player.config.volume;
+ Object.defineProperty(player.media, 'volume', {
+ get: function get() {
+ return volume;
+ },
+ set: function set(input) {
+ player.embed.setVolume(input).then(function () {
+ volume = input;
+ triggerEvent.call(player, player.media, 'volumechange');
+ });
+ }
+ }); // Muted
- function loadScript(url) {
- return new Promise(function (resolve, reject) {
- loadjs_umd(url, {
- success: resolve,
- error: reject
- });
- });
- }
+ var muted = player.config.muted;
+ Object.defineProperty(player.media, 'muted', {
+ get: function get() {
+ return muted;
+ },
+ set: function set(input) {
+ var toggle = is.boolean(input) ? input : false;
+ player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
+ muted = toggle;
+ triggerEvent.call(player, player.media, 'volumechange');
+ });
+ }
+ }); // Loop
- // ==========================================================================
+ var loop = player.config.loop;
+ Object.defineProperty(player.media, 'loop', {
+ get: function get() {
+ return loop;
+ },
+ set: function set(input) {
+ var toggle = is.boolean(input) ? input : player.config.loop.active;
+ player.embed.setLoop(toggle).then(function () {
+ loop = toggle;
+ });
+ }
+ }); // Source
- // Parse Vimeo ID from URL
- function parseId(url) {
- if (is.empty(url)) {
- return null;
+ var currentSrc;
+ player.embed.getVideoUrl().then(function (value) {
+ currentSrc = value;
+ }).catch(function (error) {
+ _this2.debug.warn(error);
+ });
+ Object.defineProperty(player.media, 'currentSrc', {
+ get: function get() {
+ return currentSrc;
}
+ }); // Ended
- if (is.number(Number(url))) {
- return url;
+ Object.defineProperty(player.media, 'ended', {
+ get: function get() {
+ return player.currentTime === player.duration;
}
+ }); // Set aspect ratio based on video size
+
+ Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
+ var ratio = getAspectRatio(dimensions[0], dimensions[1]);
+ vimeo.setAspectRatio.call(_this2, ratio);
+ }); // Set autopause
+
+ player.embed.setAutopause(player.config.autopause).then(function (state) {
+ player.config.autopause = state;
+ }); // Get title
+
+ player.embed.getVideoTitle().then(function (title) {
+ player.config.title = title;
+ ui.setTitle.call(_this2);
+ }); // Get current time
+
+ player.embed.getCurrentTime().then(function (value) {
+ currentTime = value;
+ triggerEvent.call(player, player.media, 'timeupdate');
+ }); // Get duration
+
+ player.embed.getDuration().then(function (value) {
+ player.media.duration = value;
+ triggerEvent.call(player, player.media, 'durationchange');
+ }); // Get captions
+
+ player.embed.getTextTracks().then(function (tracks) {
+ player.media.textTracks = tracks;
+ captions.setup.call(player);
+ });
+ player.embed.on('cuechange', function (_ref) {
+ var _ref$cues = _ref.cues,
+ cues = _ref$cues === void 0 ? [] : _ref$cues;
+ var strippedCues = cues.map(function (cue) {
+ return stripHTML(cue.text);
+ });
+ captions.updateCues.call(player, strippedCues);
+ });
+ player.embed.on('loaded', function () {
+ // Assure state and events are updated on autoplay
+ player.embed.getPaused().then(function (paused) {
+ assurePlaybackState.call(player, !paused);
- var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
- return url.match(regex) ? RegExp.$2 : url;
- }
+ if (!paused) {
+ triggerEvent.call(player, player.media, 'playing');
+ }
+ });
- // Get aspect ratio for dimensions
- function getAspectRatio(width, height) {
- var getRatio = function getRatio(w, h) {
- return h === 0 ? w : getRatio(h, w % h);
- };
- var ratio = getRatio(width, height);
- return width / ratio + ':' + height / ratio;
- }
+ if (is.element(player.embed.element) && player.supported.ui) {
+ var frame = player.embed.element; // Fix keyboard focus issues
+ // https://github.com/sampotts/plyr/issues/317
- // Set playback state and trigger change (only on actual change)
- function assurePlaybackState(play) {
- if (play && !this.embed.hasPlayed) {
- this.embed.hasPlayed = true;
+ frame.setAttribute('tabindex', -1);
}
- if (this.media.paused === play) {
- this.media.paused = !play;
- triggerEvent.call(this, this.media, play ? 'play' : 'pause');
- }
- }
+ });
+ player.embed.on('play', function () {
+ assurePlaybackState.call(player, true);
+ triggerEvent.call(player, player.media, 'playing');
+ });
+ player.embed.on('pause', function () {
+ assurePlaybackState.call(player, false);
+ });
+ player.embed.on('timeupdate', function (data) {
+ player.media.seeking = false;
+ currentTime = data.seconds;
+ triggerEvent.call(player, player.media, 'timeupdate');
+ });
+ player.embed.on('progress', function (data) {
+ player.media.buffered = data.percent;
+ triggerEvent.call(player, player.media, 'progress'); // Check all loaded
- var vimeo = {
- setup: function setup() {
- var _this = this;
+ if (parseInt(data.percent, 10) === 1) {
+ triggerEvent.call(player, player.media, 'canplaythrough');
+ } // Get duration as if we do it before load, it gives an incorrect value
+ // https://github.com/sampotts/plyr/issues/891
- // Add embed class for responsive
- toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
- // Set intial ratio
- vimeo.setAspectRatio.call(this);
+ player.embed.getDuration().then(function (value) {
+ if (value !== player.media.duration) {
+ player.media.duration = value;
+ triggerEvent.call(player, player.media, 'durationchange');
+ }
+ });
+ });
+ player.embed.on('seeked', function () {
+ player.media.seeking = false;
+ triggerEvent.call(player, player.media, 'seeked');
+ });
+ player.embed.on('ended', function () {
+ player.media.paused = true;
+ triggerEvent.call(player, player.media, 'ended');
+ });
+ player.embed.on('error', function (detail) {
+ player.media.error = detail;
+ triggerEvent.call(player, player.media, 'error');
+ }); // Rebuild UI
+
+ setTimeout(function () {
+ return ui.build.call(player);
+ }, 0);
+ }
+ };
- // Load the API if not already
- if (!is.object(window.Vimeo)) {
- loadScript(this.config.urls.vimeo.sdk).then(function () {
- vimeo.ready.call(_this);
- }).catch(function (error) {
- _this.debug.warn('Vimeo API failed to load', error);
- });
- } else {
- vimeo.ready.call(this);
- }
- },
+ // ==========================================================================
+ function parseId$1(url) {
+ if (is.empty(url)) {
+ return null;
+ }
- // Set aspect ratio
- // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI
- setAspectRatio: function setAspectRatio(input) {
- var _split = (is.string(input) ? input : this.config.ratio).split(':'),
- _split2 = slicedToArray(_split, 2),
- x = _split2[0],
- y = _split2[1];
+ var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+ } // Set playback state and trigger change (only on actual change)
- var padding = 100 / x * y;
- this.elements.wrapper.style.paddingBottom = padding + '%';
- if (this.supported.ui) {
- var height = 240;
- var offset = (height - padding) / (height / 50);
+ function assurePlaybackState$1(play) {
+ if (play && !this.embed.hasPlayed) {
+ this.embed.hasPlayed = true;
+ }
- this.media.style.transform = 'translateY(-' + offset + '%)';
- }
- },
+ if (this.media.paused === play) {
+ this.media.paused = !play;
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
+ }
+ }
+ var youtube = {
+ setup: function setup() {
+ var _this = this;
- // API Ready
- ready: function ready$$1() {
- var _this2 = this;
-
- var player = this;
-
- // Get Vimeo params for the iframe
- var options = {
- loop: player.config.loop.active,
- autoplay: player.autoplay,
- // muted: player.muted,
- byline: false,
- portrait: false,
- title: false,
- speed: true,
- transparent: 0,
- gesture: 'media',
- playsinline: !this.config.fullscreen.iosNative
- };
- var params = buildUrlParams(options);
+ // Add embed class for responsive
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio
- // Get the source URL or ID
- var source = player.media.getAttribute('src');
+ youtube.setAspectRatio.call(this); // Setup API
- // Get from <div> if needed
- if (is.empty(source)) {
- source = player.media.getAttribute(player.config.attributes.embed.id);
- }
+ if (is.object(window.YT) && is.function(window.YT.Player)) {
+ youtube.ready.call(this);
+ } else {
+ // Load the API
+ loadScript(this.config.urls.youtube.sdk).catch(function (error) {
+ _this.debug.warn('YouTube API failed to load', error);
+ }); // Setup callback for the API
+ // YouTube has it's own system of course...
+
+ window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue
+
+ window.onYouTubeReadyCallbacks.push(function () {
+ youtube.ready.call(_this);
+ }); // Set callback to process queue
+
+ window.onYouTubeIframeAPIReady = function () {
+ window.onYouTubeReadyCallbacks.forEach(function (callback) {
+ callback();
+ });
+ };
+ }
+ },
+ // Get the media title
+ getTitle: function getTitle(videoId) {
+ var _this2 = this;
+
+ // Try via undocumented API method first
+ // This method disappears now and then though...
+ // https://github.com/sampotts/plyr/issues/709
+ if (is.function(this.embed.getVideoData)) {
+ var _this$embed$getVideoD = this.embed.getVideoData(),
+ title = _this$embed$getVideoD.title;
+
+ if (is.empty(title)) {
+ this.config.title = title;
+ ui.setTitle.call(this);
+ return;
+ }
+ } // Or via Google API
- var id = parseId(source);
- // Build an iframe
- var iframe = createElement('iframe');
- var src = format(player.config.urls.vimeo.iframe, id, params);
- iframe.setAttribute('src', src);
- iframe.setAttribute('allowfullscreen', '');
- iframe.setAttribute('allowtransparency', '');
- iframe.setAttribute('allow', 'autoplay');
+ var key = this.config.keys.google;
- // Get poster, if already set
- var poster = player.poster;
+ if (is.string(key) && !is.empty(key)) {
+ var url = format(this.config.urls.youtube.api, videoId, key);
+ fetch(url).then(function (result) {
+ if (is.object(result)) {
+ _this2.config.title = result.items[0].snippet.title;
+ ui.setTitle.call(_this2);
+ }
+ }).catch(function () {});
+ }
+ },
+ // Set aspect ratio
+ setAspectRatio: function setAspectRatio() {
+ var ratio = this.config.ratio.split(':');
+ this.elements.wrapper.style.paddingBottom = "".concat(100 / ratio[0] * ratio[1], "%");
+ },
+ // API ready
+ ready: function ready$$1() {
+ var player = this; // Ignore already setup (race condition)
- // Inject the package
+ var currentId = player.media.getAttribute('id');
- var wrapper = createElement('div', { poster: poster, class: player.config.classNames.embedContainer });
- wrapper.appendChild(iframe);
- player.media = replaceElement(wrapper, player.media);
+ if (!is.empty(currentId) && currentId.startsWith('youtube-')) {
+ return;
+ } // Get the source URL or ID
- // Get poster image
- fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
- if (is.empty(response)) {
- return;
- }
- // Get the URL for thumbnail
- var url = new URL(response[0].thumbnail_large);
+ var source = player.media.getAttribute('src'); // Get from <div> if needed
- // Get original image
- url.pathname = url.pathname.split('_')[0] + '.jpg';
+ if (is.empty(source)) {
+ source = player.media.getAttribute(this.config.attributes.embed.id);
+ } // Replace the <iframe> with a <div> due to YouTube API issues
- // Set and show poster
- ui.setPoster.call(player, url.href).catch(function () {});
- });
- // Setup instance
- // https://github.com/vimeo/player.js
- player.embed = new window.Vimeo.Player(iframe, {
- autopause: player.config.autopause,
- muted: player.muted
- });
+ var videoId = parseId$1(source);
+ var id = generateId(player.provider); // Get poster, if already set
- player.media.paused = true;
- player.media.currentTime = 0;
+ var poster = player.poster; // Replace media element
- // Disable native text track rendering
- if (player.supported.ui) {
- player.embed.disableTextTrack();
- }
+ var container = createElement('div', {
+ id: id,
+ poster: poster
+ });
+ player.media = replaceElement(container, player.media); // Id to poster wrapper
+
+ var posterSrc = function posterSrc(format$$1) {
+ return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg");
+ }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
+
+
+ loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
+ .catch(function () {
+ return loadImage(posterSrc('sd'), 121);
+ }) // 480p padded 4:3
+ .catch(function () {
+ return loadImage(posterSrc('hq'));
+ }) // 360p padded 4:3. Always exists
+ .then(function (image) {
+ return ui.setPoster.call(player, image.src);
+ }).then(function (posterSrc) {
+ // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
+ if (!posterSrc.includes('maxres')) {
+ player.elements.poster.style.backgroundSize = 'cover';
+ }
+ }).catch(function () {}); // Setup instance
+ // https://developers.google.com/youtube/iframe_api_reference
+
+ player.embed = new window.YT.Player(id, {
+ videoId: videoId,
+ playerVars: {
+ autoplay: player.config.autoplay ? 1 : 0,
+ // Autoplay
+ hl: player.config.hl,
+ // iframe interface language
+ controls: player.supported.ui ? 0 : 1,
+ // Only show controls if not fully supported
+ rel: 0,
+ // No related vids
+ showinfo: 0,
+ // Hide info
+ iv_load_policy: 3,
+ // Hide annotations
+ modestbranding: 1,
+ // Hide logos as much as possible (they still show one in the corner when paused)
+ disablekb: 1,
+ // Disable keyboard as we handle it
+ playsinline: 1,
+ // Allow iOS inline playback
+ // Tracking for stats
+ // origin: window ? `${window.location.protocol}//${window.location.host}` : null,
+ widget_referrer: window ? window.location.href : null,
+ // Captions are flaky on YouTube
+ cc_load_policy: player.captions.active ? 1 : 0,
+ cc_lang_pref: player.config.captions.language
+ },
+ events: {
+ onError: function onError(event) {
+ // YouTube may fire onError twice, so only handle it once
+ if (!player.media.error) {
+ var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
+
+ var message = {
+ 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
+ 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
+ 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
+ 101: 'The owner of the requested video does not allow it to be played in embedded players.',
+ 150: 'The owner of the requested video does not allow it to be played in embedded players.'
+ }[code] || 'An unknown error occured';
+ player.media.error = {
+ code: code,
+ message: message
+ };
+ triggerEvent.call(player, player.media, 'error');
+ }
+ },
+ onPlaybackRateChange: function onPlaybackRateChange(event) {
+ // Get the instance
+ var instance = event.target; // Get current speed
+
+ player.media.playbackRate = instance.getPlaybackRate();
+ triggerEvent.call(player, player.media, 'ratechange');
+ },
+ onReady: function onReady(event) {
+ // Bail if onReady has already been called. See issue #1108
+ if (is.function(player.media.play)) {
+ return;
+ } // Get the instance
+
+
+ var instance = event.target; // Get the title
+
+ youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API
- // Create a faux HTML5 API using the Vimeo API
player.media.play = function () {
- assurePlaybackState.call(player, true);
- return player.embed.play();
+ assurePlaybackState$1.call(player, true);
+ instance.playVideo();
};
player.media.pause = function () {
- assurePlaybackState.call(player, false);
- return player.embed.pause();
+ assurePlaybackState$1.call(player, false);
+ instance.pauseVideo();
};
player.media.stop = function () {
- player.pause();
- player.currentTime = 0;
+ instance.stopVideo();
};
- // Seeking
- var currentTime = player.media.currentTime;
+ player.media.duration = instance.getDuration();
+ player.media.paused = true; // Seeking
+ player.media.currentTime = 0;
Object.defineProperty(player.media, 'currentTime', {
- get: function get$$1() {
- return currentTime;
- },
- set: function set$$1(time) {
- // Vimeo will automatically play on seek if the video hasn't been played before
-
- // Get current paused state and volume etc
- var embed = player.embed,
- media = player.media,
- paused = player.paused,
- volume = player.volume;
-
- var restorePause = paused && !embed.hasPlayed;
-
- // Set seeking state and trigger event
- media.seeking = true;
- triggerEvent.call(player, media, 'seeking');
-
- // If paused, mute until seek is complete
- Promise.resolve(restorePause && embed.setVolume(0))
- // Seek
- .then(function () {
- return embed.setCurrentTime(time);
- })
- // Restore paused
- .then(function () {
- return restorePause && embed.pause();
- })
- // Restore volume
- .then(function () {
- return restorePause && embed.setVolume(volume);
- }).catch(function () {
- // Do nothing
- });
- }
- });
+ get: function get() {
+ return Number(instance.getCurrentTime());
+ },
+ set: function set(time) {
+ // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
+ if (player.paused && !player.embed.hasPlayed) {
+ player.embed.mute();
+ } // Set seeking state and trigger event
+
+
+ player.media.seeking = true;
+ triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent
+
+ instance.seekTo(time);
+ }
+ }); // Playback speed
- // Playback speed
- var speed = player.config.speed.selected;
Object.defineProperty(player.media, 'playbackRate', {
- get: function get$$1() {
- return speed;
- },
- set: function set$$1(input) {
- player.embed.setPlaybackRate(input).then(function () {
- speed = input;
- triggerEvent.call(player, player.media, 'ratechange');
- }).catch(function (error) {
- // Hide menu item (and menu if empty)
- if (error.name === 'Error') {
- controls.setSpeedMenu.call(player, []);
- }
- });
- }
- });
+ get: function get() {
+ return instance.getPlaybackRate();
+ },
+ set: function set(input) {
+ instance.setPlaybackRate(input);
+ }
+ }); // Volume
- // Volume
var volume = player.config.volume;
-
Object.defineProperty(player.media, 'volume', {
- get: function get$$1() {
- return volume;
- },
- set: function set$$1(input) {
- player.embed.setVolume(input).then(function () {
- volume = input;
- triggerEvent.call(player, player.media, 'volumechange');
- });
- }
- });
+ get: function get() {
+ return volume;
+ },
+ set: function set(input) {
+ volume = input;
+ instance.setVolume(volume * 100);
+ triggerEvent.call(player, player.media, 'volumechange');
+ }
+ }); // Muted
- // Muted
var muted = player.config.muted;
-
Object.defineProperty(player.media, 'muted', {
- get: function get$$1() {
- return muted;
- },
- set: function set$$1(input) {
- var toggle = is.boolean(input) ? input : false;
-
- player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
- muted = toggle;
- triggerEvent.call(player, player.media, 'volumechange');
- });
- }
- });
-
- // Loop
- var loop = player.config.loop;
-
- Object.defineProperty(player.media, 'loop', {
- get: function get$$1() {
- return loop;
- },
- set: function set$$1(input) {
- var toggle = is.boolean(input) ? input : player.config.loop.active;
-
- player.embed.setLoop(toggle).then(function () {
- loop = toggle;
- });
- }
- });
-
- // Source
- var currentSrc = void 0;
- player.embed.getVideoUrl().then(function (value) {
- currentSrc = value;
- }).catch(function (error) {
- _this2.debug.warn(error);
- });
+ get: function get() {
+ return muted;
+ },
+ set: function set(input) {
+ var toggle = is.boolean(input) ? input : muted;
+ muted = toggle;
+ instance[toggle ? 'mute' : 'unMute']();
+ triggerEvent.call(player, player.media, 'volumechange');
+ }
+ }); // Source
Object.defineProperty(player.media, 'currentSrc', {
- get: function get$$1() {
- return currentSrc;
- }
- });
+ get: function get() {
+ return instance.getVideoUrl();
+ }
+ }); // Ended
- // Ended
Object.defineProperty(player.media, 'ended', {
- get: function get$$1() {
- return player.currentTime === player.duration;
- }
- });
-
- // Set aspect ratio based on video size
- Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
- var ratio = getAspectRatio(dimensions[0], dimensions[1]);
- vimeo.setAspectRatio.call(_this2, ratio);
- });
+ get: function get() {
+ return player.currentTime === player.duration;
+ }
+ }); // Get available speeds
- // Set autopause
- player.embed.setAutopause(player.config.autopause).then(function (state) {
- player.config.autopause = state;
- });
-
- // Get title
- player.embed.getVideoTitle().then(function (title) {
- player.config.title = title;
- ui.setTitle.call(_this2);
- });
-
- // Get current time
- player.embed.getCurrentTime().then(function (value) {
- currentTime = value;
- triggerEvent.call(player, player.media, 'timeupdate');
- });
-
- // Get duration
- player.embed.getDuration().then(function (value) {
- player.media.duration = value;
- triggerEvent.call(player, player.media, 'durationchange');
- });
-
- // Get captions
- player.embed.getTextTracks().then(function (tracks) {
- player.media.textTracks = tracks;
- captions.setup.call(player);
- });
-
- player.embed.on('cuechange', function (_ref) {
- var _ref$cues = _ref.cues,
- cues = _ref$cues === undefined ? [] : _ref$cues;
-
- var strippedCues = cues.map(function (cue) {
- return stripHTML(cue.text);
- });
- captions.updateCues.call(player, strippedCues);
- });
+ player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe
- player.embed.on('loaded', function () {
- // Assure state and events are updated on autoplay
- player.embed.getPaused().then(function (paused) {
- assurePlaybackState.call(player, !paused);
- if (!paused) {
- triggerEvent.call(player, player.media, 'playing');
- }
- });
-
- if (is.element(player.embed.element) && player.supported.ui) {
- var frame = player.embed.element;
-
- // Fix keyboard focus issues
- // https://github.com/sampotts/plyr/issues/317
- frame.setAttribute('tabindex', -1);
- }
- });
+ if (player.supported.ui) {
+ player.media.setAttribute('tabindex', -1);
+ }
- player.embed.on('play', function () {
- assurePlaybackState.call(player, true);
- triggerEvent.call(player, player.media, 'playing');
- });
+ triggerEvent.call(player, player.media, 'timeupdate');
+ triggerEvent.call(player, player.media, 'durationchange'); // Reset timer
- player.embed.on('pause', function () {
- assurePlaybackState.call(player, false);
- });
+ clearInterval(player.timers.buffering); // Setup buffering
- player.embed.on('timeupdate', function (data) {
- player.media.seeking = false;
- currentTime = data.seconds;
- triggerEvent.call(player, player.media, 'timeupdate');
- });
+ player.timers.buffering = setInterval(function () {
+ // Get loaded % from YouTube
+ player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something
- player.embed.on('progress', function (data) {
- player.media.buffered = data.percent;
+ if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
triggerEvent.call(player, player.media, 'progress');
+ } // Set last buffer point
- // Check all loaded
- if (parseInt(data.percent, 10) === 1) {
- triggerEvent.call(player, player.media, 'canplaythrough');
- }
-
- // Get duration as if we do it before load, it gives an incorrect value
- // https://github.com/sampotts/plyr/issues/891
- player.embed.getDuration().then(function (value) {
- if (value !== player.media.duration) {
- player.media.duration = value;
- triggerEvent.call(player, player.media, 'durationchange');
- }
- });
- });
- player.embed.on('seeked', function () {
- player.media.seeking = false;
- triggerEvent.call(player, player.media, 'seeked');
- });
+ player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%
- player.embed.on('ended', function () {
- player.media.paused = true;
- triggerEvent.call(player, player.media, 'ended');
- });
+ if (player.media.buffered === 1) {
+ clearInterval(player.timers.buffering); // Trigger event
- player.embed.on('error', function (detail) {
- player.media.error = detail;
- triggerEvent.call(player, player.media, 'error');
- });
+ triggerEvent.call(player, player.media, 'canplaythrough');
+ }
+ }, 200); // Rebuild UI
- // Rebuild UI
setTimeout(function () {
- return ui.build.call(player);
- }, 0);
- }
- };
-
- // ==========================================================================
+ return ui.build.call(player);
+ }, 50);
+ },
+ onStateChange: function onStateChange(event) {
+ // Get the instance
+ var instance = event.target; // Reset timer
+
+ clearInterval(player.timers.playing);
+ var seeked = player.media.seeking && [1, 2].includes(event.data);
+
+ if (seeked) {
+ // Unset seeking and fire seeked event
+ player.media.seeking = false;
+ triggerEvent.call(player, player.media, 'seeked');
+ } // Handle events
+ // -1 Unstarted
+ // 0 Ended
+ // 1 Playing
+ // 2 Paused
+ // 3 Buffering
+ // 5 Video cued
+
+
+ switch (event.data) {
+ case -1:
+ // Update scrubber
+ triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube
+
+ player.media.buffered = instance.getVideoLoadedFraction();
+ triggerEvent.call(player, player.media, 'progress');
+ break;
- // Parse YouTube ID from URL
- function parseId$1(url) {
- if (is.empty(url)) {
- return null;
- }
+ case 0:
+ assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.
- var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
- return url.match(regex) ? RegExp.$2 : url;
- }
+ if (player.media.loop) {
+ // YouTube needs a call to `stopVideo` before playing again
+ instance.stopVideo();
+ instance.playVideo();
+ } else {
+ triggerEvent.call(player, player.media, 'ended');
+ }
- // Set playback state and trigger change (only on actual change)
- function assurePlaybackState$1(play) {
- if (play && !this.embed.hasPlayed) {
- this.embed.hasPlayed = true;
- }
- if (this.media.paused === play) {
- this.media.paused = !play;
- triggerEvent.call(this, this.media, play ? 'play' : 'pause');
- }
- }
+ break;
- var youtube = {
- setup: function setup() {
- var _this = this;
+ case 1:
+ // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
+ if (player.media.paused && !player.embed.hasPlayed) {
+ player.media.pause();
+ } else {
+ assurePlaybackState$1.call(player, true);
+ triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress
- // Add embed class for responsive
- toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
+ player.timers.playing = setInterval(function () {
+ triggerEvent.call(player, player.media, 'timeupdate');
+ }, 50); // Check duration again due to YouTube bug
+ // https://github.com/sampotts/plyr/issues/374
+ // https://code.google.com/p/gdata-issues/issues/detail?id=8690
- // Set aspect ratio
- youtube.setAspectRatio.call(this);
+ if (player.media.duration !== instance.getDuration()) {
+ player.media.duration = instance.getDuration();
+ triggerEvent.call(player, player.media, 'durationchange');
+ }
+ }
- // Setup API
- if (is.object(window.YT) && is.function(window.YT.Player)) {
- youtube.ready.call(this);
- } else {
- // Load the API
- loadScript(this.config.urls.youtube.sdk).catch(function (error) {
- _this.debug.warn('YouTube API failed to load', error);
- });
+ break;
- // Setup callback for the API
- // YouTube has it's own system of course...
- window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];
+ case 2:
+ // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
+ if (!player.muted) {
+ player.embed.unMute();
+ }
- // Add to queue
- window.onYouTubeReadyCallbacks.push(function () {
- youtube.ready.call(_this);
- });
+ assurePlaybackState$1.call(player, false);
+ break;
- // Set callback to process queue
- window.onYouTubeIframeAPIReady = function () {
- window.onYouTubeReadyCallbacks.forEach(function (callback) {
- callback();
- });
- };
+ default:
+ break;
}
- },
+ triggerEvent.call(player, player.elements.container, 'statechange', false, {
+ code: event.data
+ });
+ }
+ }
+ });
+ }
+ };
- // Get the media title
- getTitle: function getTitle(videoId) {
- var _this2 = this;
+ // ==========================================================================
+ var media = {
+ // Setup media
+ setup: function setup() {
+ // If there's no media, bail
+ if (!this.media) {
+ this.debug.warn('No media element found!');
+ return;
+ } // Add type class
- // Try via undocumented API method first
- // This method disappears now and then though...
- // https://github.com/sampotts/plyr/issues/709
- if (is.function(this.embed.getVideoData)) {
- var _embed$getVideoData = this.embed.getVideoData(),
- title = _embed$getVideoData.title;
- if (is.empty(title)) {
- this.config.title = title;
- ui.setTitle.call(this);
- return;
- }
- }
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class
- // Or via Google API
- var key = this.config.keys.google;
- if (is.string(key) && !is.empty(key)) {
- var url = format(this.config.urls.youtube.api, videoId, key);
-
- fetch(url).then(function (result) {
- if (is.object(result)) {
- _this2.config.title = result.items[0].snippet.title;
- ui.setTitle.call(_this2);
- }
- }).catch(function () {});
- }
- },
+ toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds
+ // This will require changes if audio embeds are added
+ if (this.isEmbed) {
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
+ } // Inject the player wrapper
- // Set aspect ratio
- setAspectRatio: function setAspectRatio() {
- var ratio = this.config.ratio.split(':');
- this.elements.wrapper.style.paddingBottom = 100 / ratio[0] * ratio[1] + '%';
- },
+ if (this.isVideo) {
+ // Create the wrapper div
+ this.elements.wrapper = createElement('div', {
+ class: this.config.classNames.video
+ }); // Wrap the video in a container
- // API ready
- ready: function ready$$1() {
- var player = this;
+ wrap(this.media, this.elements.wrapper); // Faux poster container
- // Ignore already setup (race condition)
- var currentId = player.media.getAttribute('id');
- if (!is.empty(currentId) && currentId.startsWith('youtube-')) {
- return;
- }
+ this.elements.poster = createElement('div', {
+ class: this.config.classNames.poster
+ });
+ this.elements.wrapper.appendChild(this.elements.poster);
+ }
- // Get the source URL or ID
- var source = player.media.getAttribute('src');
+ if (this.isHTML5) {
+ html5.extend.call(this);
+ } else if (this.isYouTube) {
+ youtube.setup.call(this);
+ } else if (this.isVimeo) {
+ vimeo.setup.call(this);
+ }
+ }
+ };
- // Get from <div> if needed
- if (is.empty(source)) {
- source = player.media.getAttribute(this.config.attributes.embed.id);
- }
+ var Ads =
+ /*#__PURE__*/
+ function () {
+ /**
+ * Ads constructor.
+ * @param {object} player
+ * @return {Ads}
+ */
+ function Ads(player) {
+ var _this = this;
+
+ _classCallCheck(this, Ads);
+
+ this.player = player;
+ this.publisherId = player.config.ads.publisherId;
+ this.playing = false;
+ this.initialized = false;
+ this.elements = {
+ container: null,
+ displayContainer: null
+ };
+ this.manager = null;
+ this.loader = null;
+ this.cuePoints = null;
+ this.events = {};
+ this.safetyTimer = null;
+ this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready
- // Replace the <iframe> with a <div> due to YouTube API issues
- var videoId = parseId$1(source);
- var id = generateId(player.provider);
+ this.managerPromise = new Promise(function (resolve, reject) {
+ // The ad is loaded and ready
+ _this.on('loaded', resolve); // Ads failed
- // Get poster, if already set
- var poster = player.poster;
- // Replace media element
+ _this.on('error', reject);
+ });
+ this.load();
+ }
- var container = createElement('div', { id: id, poster: poster });
- player.media = replaceElement(container, player.media);
+ _createClass(Ads, [{
+ key: "load",
- // Id to poster wrapper
- var posterSrc = function posterSrc(format$$1) {
- return 'https://img.youtube.com/vi/' + videoId + '/' + format$$1 + 'default.jpg';
- };
+ /**
+ * Load the IMA SDK
+ */
+ value: function load() {
+ var _this2 = this;
- // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
- loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
- .catch(function () {
- return loadImage(posterSrc('sd'), 121);
- }) // 480p padded 4:3
- .catch(function () {
- return loadImage(posterSrc('hq'));
- }) // 360p padded 4:3. Always exists
- .then(function (image) {
- return ui.setPoster.call(player, image.src);
- }).then(function (posterSrc) {
- // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
- if (!posterSrc.includes('maxres')) {
- player.elements.poster.style.backgroundSize = 'cover';
- }
- }).catch(function () {});
-
- // Setup instance
- // https://developers.google.com/youtube/iframe_api_reference
- player.embed = new window.YT.Player(id, {
- videoId: videoId,
- playerVars: {
- autoplay: player.config.autoplay ? 1 : 0, // Autoplay
- hl: player.config.hl, // iframe interface language
- controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported
- rel: 0, // No related vids
- showinfo: 0, // Hide info
- iv_load_policy: 3, // Hide annotations
- modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)
- disablekb: 1, // Disable keyboard as we handle it
- playsinline: 1, // Allow iOS inline playback
-
- // Tracking for stats
- // origin: window ? `${window.location.protocol}//${window.location.host}` : null,
- widget_referrer: window ? window.location.href : null,
-
- // Captions are flaky on YouTube
- cc_load_policy: player.captions.active ? 1 : 0,
- cc_lang_pref: player.config.captions.language
- },
- events: {
- onError: function onError(event) {
- // YouTube may fire onError twice, so only handle it once
- if (!player.media.error) {
- var code = event.data;
- // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
- var message = {
- 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
- 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
- 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
- 101: 'The owner of the requested video does not allow it to be played in embedded players.',
- 150: 'The owner of the requested video does not allow it to be played in embedded players.'
- }[code] || 'An unknown error occured';
-
- player.media.error = { code: code, message: message };
-
- triggerEvent.call(player, player.media, 'error');
- }
- },
- onPlaybackRateChange: function onPlaybackRateChange(event) {
- // Get the instance
- var instance = event.target;
-
- // Get current speed
- player.media.playbackRate = instance.getPlaybackRate();
-
- triggerEvent.call(player, player.media, 'ratechange');
- },
- onReady: function onReady(event) {
- // Bail if onReady has already been called. See issue #1108
- if (is.function(player.media.play)) {
- return;
- }
- // Get the instance
- var instance = event.target;
-
- // Get the title
- youtube.getTitle.call(player, videoId);
-
- // Create a faux HTML5 API using the YouTube API
- player.media.play = function () {
- assurePlaybackState$1.call(player, true);
- instance.playVideo();
- };
-
- player.media.pause = function () {
- assurePlaybackState$1.call(player, false);
- instance.pauseVideo();
- };
-
- player.media.stop = function () {
- instance.stopVideo();
- };
-
- player.media.duration = instance.getDuration();
- player.media.paused = true;
-
- // Seeking
- player.media.currentTime = 0;
- Object.defineProperty(player.media, 'currentTime', {
- get: function get() {
- return Number(instance.getCurrentTime());
- },
- set: function set(time) {
- // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
- if (player.paused && !player.embed.hasPlayed) {
- player.embed.mute();
- }
-
- // Set seeking state and trigger event
- player.media.seeking = true;
- triggerEvent.call(player, player.media, 'seeking');
-
- // Seek after events sent
- instance.seekTo(time);
- }
- });
-
- // Playback speed
- Object.defineProperty(player.media, 'playbackRate', {
- get: function get() {
- return instance.getPlaybackRate();
- },
- set: function set(input) {
- instance.setPlaybackRate(input);
- }
- });
-
- // Volume
- var volume = player.config.volume;
-
- Object.defineProperty(player.media, 'volume', {
- get: function get() {
- return volume;
- },
- set: function set(input) {
- volume = input;
- instance.setVolume(volume * 100);
- triggerEvent.call(player, player.media, 'volumechange');
- }
- });
-
- // Muted
- var muted = player.config.muted;
-
- Object.defineProperty(player.media, 'muted', {
- get: function get() {
- return muted;
- },
- set: function set(input) {
- var toggle = is.boolean(input) ? input : muted;
- muted = toggle;
- instance[toggle ? 'mute' : 'unMute']();
- triggerEvent.call(player, player.media, 'volumechange');
- }
- });
-
- // Source
- Object.defineProperty(player.media, 'currentSrc', {
- get: function get() {
- return instance.getVideoUrl();
- }
- });
-
- // Ended
- Object.defineProperty(player.media, 'ended', {
- get: function get() {
- return player.currentTime === player.duration;
- }
- });
-
- // Get available speeds
- player.options.speed = instance.getAvailablePlaybackRates();
-
- // Set the tabindex to avoid focus entering iframe
- if (player.supported.ui) {
- player.media.setAttribute('tabindex', -1);
- }
-
- triggerEvent.call(player, player.media, 'timeupdate');
- triggerEvent.call(player, player.media, 'durationchange');
-
- // Reset timer
- clearInterval(player.timers.buffering);
-
- // Setup buffering
- player.timers.buffering = setInterval(function () {
- // Get loaded % from YouTube
- player.media.buffered = instance.getVideoLoadedFraction();
-
- // Trigger progress only when we actually buffer something
- if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
- triggerEvent.call(player, player.media, 'progress');
- }
-
- // Set last buffer point
- player.media.lastBuffered = player.media.buffered;
-
- // Bail if we're at 100%
- if (player.media.buffered === 1) {
- clearInterval(player.timers.buffering);
-
- // Trigger event
- triggerEvent.call(player, player.media, 'canplaythrough');
- }
- }, 200);
-
- // Rebuild UI
- setTimeout(function () {
- return ui.build.call(player);
- }, 50);
- },
- onStateChange: function onStateChange(event) {
- // Get the instance
- var instance = event.target;
-
- // Reset timer
- clearInterval(player.timers.playing);
-
- var seeked = player.media.seeking && [1, 2].includes(event.data);
-
- if (seeked) {
- // Unset seeking and fire seeked event
- player.media.seeking = false;
- triggerEvent.call(player, player.media, 'seeked');
- }
-
- // Handle events
- // -1 Unstarted
- // 0 Ended
- // 1 Playing
- // 2 Paused
- // 3 Buffering
- // 5 Video cued
- switch (event.data) {
- case -1:
- // Update scrubber
- triggerEvent.call(player, player.media, 'timeupdate');
-
- // Get loaded % from YouTube
- player.media.buffered = instance.getVideoLoadedFraction();
- triggerEvent.call(player, player.media, 'progress');
-
- break;
-
- case 0:
- assurePlaybackState$1.call(player, false);
-
- // YouTube doesn't support loop for a single video, so mimick it.
- if (player.media.loop) {
- // YouTube needs a call to `stopVideo` before playing again
- instance.stopVideo();
- instance.playVideo();
- } else {
- triggerEvent.call(player, player.media, 'ended');
- }
-
- break;
-
- case 1:
- // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
- if (player.media.paused && !player.embed.hasPlayed) {
- player.media.pause();
- } else {
- assurePlaybackState$1.call(player, true);
-
- triggerEvent.call(player, player.media, 'playing');
-
- // Poll to get playback progress
- player.timers.playing = setInterval(function () {
- triggerEvent.call(player, player.media, 'timeupdate');
- }, 50);
-
- // Check duration again due to YouTube bug
- // https://github.com/sampotts/plyr/issues/374
- // https://code.google.com/p/gdata-issues/issues/detail?id=8690
- if (player.media.duration !== instance.getDuration()) {
- player.media.duration = instance.getDuration();
- triggerEvent.call(player, player.media, 'durationchange');
- }
- }
-
- break;
-
- case 2:
- // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
- if (!player.muted) {
- player.embed.unMute();
- }
- assurePlaybackState$1.call(player, false);
-
- break;
-
- default:
- break;
- }
-
- triggerEvent.call(player, player.elements.container, 'statechange', false, {
- code: event.data
- });
- }
- }
+ if (this.enabled) {
+ // Check if the Google IMA3 SDK is loaded or load it ourselves
+ if (!is.object(window.google) || !is.object(window.google.ima)) {
+ loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
+ _this2.ready();
+ }).catch(function () {
+ // Script failed to load or is blocked
+ _this2.trigger('error', new Error('Google IMA SDK failed to load'));
});
+ } else {
+ this.ready();
+ }
}
- };
+ }
+ /**
+ * Get the ads instance ready
+ */
+
+ }, {
+ key: "ready",
+ value: function ready$$1() {
+ var _this3 = this;
+
+ // Start ticking our safety timer. If the whole advertisement
+ // thing doesn't resolve within our set time; we bail
+ this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
+
+ this.managerPromise.then(function () {
+ _this3.clearSafetyTimer('onAdsManagerLoaded()');
+ }); // Set listeners on the Plyr instance
+
+ this.listeners(); // Setup the IMA SDK
+
+ this.setupIMA();
+ } // Build the default tag URL
+
+ }, {
+ key: "setupIMA",
+
+ /**
+ * In order for the SDK to display ads for our video, we need to tell it where to put them,
+ * so here we define our ad container. This div is set up to render on top of the video player.
+ * Using the code below, we tell the SDK to render ads within that div. We also provide a
+ * handle to the content video player - the SDK will poll the current time of our player to
+ * properly place mid-rolls. After we create the ad display container, we initialize it. On
+ * mobile devices, this initialization is done as the result of a user action.
+ */
+ value: function setupIMA() {
+ // Create the container for our advertisements
+ this.elements.container = createElement('div', {
+ class: this.player.config.classNames.ads
+ });
+ this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
- // ==========================================================================
+ google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language
- var media = {
- // Setup media
- setup: function setup() {
- // If there's no media, bail
- if (!this.media) {
- this.debug.warn('No media element found!');
- return;
- }
+ google.ima.settings.setLocale(this.player.config.ads.language); // We assume the adContainer is the video container of the plyr element
+ // that will house the ads
- // Add type class
- toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);
+ this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container); // Request video ads to be pre-loaded
- // Add provider class
- toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);
+ this.requestAds();
+ }
+ /**
+ * Request advertisements
+ */
- // Add video class for embeds
- // This will require changes if audio embeds are added
- if (this.isEmbed) {
- toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
- }
+ }, {
+ key: "requestAds",
+ value: function requestAds() {
+ var _this4 = this;
- // Inject the player wrapper
- if (this.isVideo) {
- // Create the wrapper div
- this.elements.wrapper = createElement('div', {
- class: this.config.classNames.video
- });
+ var container = this.player.elements.container;
- // Wrap the video in a container
- wrap(this.media, this.elements.wrapper);
+ try {
+ // Create ads loader
+ this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
- // Faux poster container
- this.elements.poster = createElement('div', {
- class: this.config.classNames.poster
- });
+ this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
+ return _this4.onAdsManagerLoaded(event);
+ }, false);
+ this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this4.onAdError(error);
+ }, false); // Request video ads
- this.elements.wrapper.appendChild(this.elements.poster);
- }
+ var request = new google.ima.AdsRequest();
+ request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
+ // to select the correct creative if multiple are returned
- if (this.isHTML5) {
- html5.extend.call(this);
- } else if (this.isYouTube) {
- youtube.setup.call(this);
- } else if (this.isVimeo) {
- vimeo.setup.call(this);
- }
- }
- };
+ request.linearAdSlotWidth = container.offsetWidth;
+ request.linearAdSlotHeight = container.offsetHeight;
+ request.nonLinearAdSlotWidth = container.offsetWidth;
+ request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.
- // ==========================================================================
-
- var Ads = function () {
- /**
- * Ads constructor.
- * @param {object} player
- * @return {Ads}
- */
- function Ads(player) {
- var _this = this;
-
- classCallCheck(this, Ads);
-
- this.player = player;
- this.publisherId = player.config.ads.publisherId;
- this.playing = false;
- this.initialized = false;
- this.elements = {
- container: null,
- displayContainer: null
- };
- this.manager = null;
- this.loader = null;
- this.cuePoints = null;
- this.events = {};
- this.safetyTimer = null;
- this.countdownTimer = null;
-
- // Setup a promise to resolve when the IMA manager is ready
- this.managerPromise = new Promise(function (resolve, reject) {
- // The ad is loaded and ready
- _this.on('loaded', resolve);
-
- // Ads failed
- _this.on('error', reject);
- });
+ request.forceNonLinearFullSlot = false; // Mute based on current state
- this.load();
+ request.setAdWillPlayMuted(!this.player.muted);
+ this.loader.requestAds(request);
+ } catch (e) {
+ this.onAdError(e);
+ }
+ }
+ /**
+ * Update the ad countdown
+ * @param {boolean} start
+ */
+
+ }, {
+ key: "pollCountdown",
+ value: function pollCountdown() {
+ var _this5 = this;
+
+ var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ if (!start) {
+ clearInterval(this.countdownTimer);
+ this.elements.container.removeAttribute('data-badge-text');
+ return;
}
- createClass(Ads, [{
- key: 'load',
-
-
- /**
- * Load the IMA SDK
- */
- value: function load() {
- var _this2 = this;
-
- if (this.enabled) {
- // Check if the Google IMA3 SDK is loaded or load it ourselves
- if (!is.object(window.google) || !is.object(window.google.ima)) {
- loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
- _this2.ready();
- }).catch(function () {
- // Script failed to load or is blocked
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
- });
- } else {
- this.ready();
- }
- }
- }
-
- /**
- * Get the ads instance ready
- */
-
- }, {
- key: 'ready',
- value: function ready$$1() {
- var _this3 = this;
-
- // Start ticking our safety timer. If the whole advertisement
- // thing doesn't resolve within our set time; we bail
- this.startSafetyTimer(12000, 'ready()');
+ var update = function update() {
+ var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
+ var label = "".concat(i18n.get('advertisement', _this5.player.config), " - ").concat(time);
- // Clear the safety timer
- this.managerPromise.then(function () {
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
- });
+ _this5.elements.container.setAttribute('data-badge-text', label);
+ };
- // Set listeners on the Plyr instance
- this.listeners();
+ this.countdownTimer = setInterval(update, 100);
+ }
+ /**
+ * This method is called whenever the ads are ready inside the AdDisplayContainer
+ * @param {Event} adsManagerLoadedEvent
+ */
- // Setup the IMA SDK
- this.setupIMA();
- }
+ }, {
+ key: "onAdsManagerLoaded",
+ value: function onAdsManagerLoaded(event) {
+ var _this6 = this;
- // Build the default tag URL
+ // Load could occur after a source change (race condition)
+ if (!this.enabled) {
+ return;
+ } // Get the ads manager
- }, {
- key: 'setupIMA',
+ var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf
- /**
- * In order for the SDK to display ads for our video, we need to tell it where to put them,
- * so here we define our ad container. This div is set up to render on top of the video player.
- * Using the code below, we tell the SDK to render ads within that div. We also provide a
- * handle to the content video player - the SDK will poll the current time of our player to
- * properly place mid-rolls. After we create the ad display container, we initialize it. On
- * mobile devices, this initialization is done as the result of a user action.
- */
- value: function setupIMA() {
- // Create the container for our advertisements
- this.elements.container = createElement('div', {
- class: this.player.config.classNames.ads
- });
- this.player.elements.container.appendChild(this.elements.container);
+ settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
+ settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration
+ // so it can determine when to start the mid- and post-roll
- // So we can run VPAID2
- google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);
+ this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
- // Set language
- google.ima.settings.setLocale(this.player.config.ads.language);
+ this.cuePoints = this.manager.getCuePoints(); // Add advertisement cue's within the time line if available
- // We assume the adContainer is the video container of the plyr element
- // that will house the ads
- this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);
+ if (!is.empty(this.cuePoints)) {
+ this.cuePoints.forEach(function (cuePoint) {
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this6.player.duration) {
+ var seekElement = _this6.player.elements.progress;
- // Request video ads to be pre-loaded
- this.requestAds();
+ if (is.element(seekElement)) {
+ var cuePercentage = 100 / _this6.player.duration * cuePoint;
+ var cue = createElement('span', {
+ class: _this6.player.config.classNames.cues
+ });
+ cue.style.left = "".concat(cuePercentage.toString(), "%");
+ seekElement.appendChild(cue);
+ }
}
+ });
+ } // Set volume to match player
- /**
- * Request advertisements
- */
-
- }, {
- key: 'requestAds',
- value: function requestAds() {
- var _this4 = this;
-
- var container = this.player.elements.container;
-
-
- try {
- // Create ads loader
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer);
- // Listen and respond to ads loaded and error events
- this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
- return _this4.onAdsManagerLoaded(event);
- }, false);
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this4.onAdError(error);
- }, false);
+ this.manager.setVolume(this.player.volume); // Add listeners to the required events
+ // Advertisement error events
- // Request video ads
- var request = new google.ima.AdsRequest();
- request.adTagUrl = this.tagUrl;
-
- // Specify the linear and nonlinear slot sizes. This helps the SDK
- // to select the correct creative if multiple are returned
- request.linearAdSlotWidth = container.offsetWidth;
- request.linearAdSlotHeight = container.offsetHeight;
- request.nonLinearAdSlotWidth = container.offsetWidth;
- request.nonLinearAdSlotHeight = container.offsetHeight;
-
- // We only overlay ads as we only support video.
- request.forceNonLinearFullSlot = false;
-
- // Mute based on current state
- request.setAdWillPlayMuted(!this.player.muted);
-
- this.loader.requestAds(request);
- } catch (e) {
- this.onAdError(e);
- }
- }
+ this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this6.onAdError(error);
+ }); // Advertisement regular events
- /**
- * Update the ad countdown
- * @param {boolean} start
- */
+ Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
+ _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {
+ return _this6.onAdEvent(event);
+ });
+ }); // Resolve our adsManager
- }, {
- key: 'pollCountdown',
- value: function pollCountdown() {
- var _this5 = this;
+ this.trigger('loaded');
+ }
+ /**
+ * This is where all the event handling takes place. Retrieve the ad from the event. Some
+ * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
+ * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
+ * @param {Event} event
+ */
+
+ }, {
+ key: "onAdEvent",
+ value: function onAdEvent(event) {
+ var _this7 = this;
+
+ var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
+ // don't have ad object associated
+
+ var ad = event.getAd(); // Proxy event
+
+ var dispatchEvent = function dispatchEvent(type) {
+ var event = "ads".concat(type.replace(/_/g, '').toLowerCase());
+ triggerEvent.call(_this7.player, _this7.player.media, event);
+ };
- var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ switch (event.type) {
+ case google.ima.AdEvent.Type.LOADED:
+ // This is the first event sent for an ad - it is possible to determine whether the
+ // ad is a video ad or an overlay
+ this.trigger('loaded'); // Bubble event
+
+ dispatchEvent(event.type); // Start countdown
+
+ this.pollCountdown(true);
+
+ if (!ad.isLinear()) {
+ // Position AdDisplayContainer correctly for overlay
+ ad.width = container.offsetWidth;
+ ad.height = container.offsetHeight;
+ } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
+ // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
+
+
+ break;
+
+ case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
+ // All ads for the current videos are done. We can now request new advertisements
+ // in case the video is re-played
+ // Fire event
+ dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded.
+ // So here we load a new video when all ads are done.
+ // Then we load new ads within a new adsManager. When the video
+ // Is started - after - the ads are loaded, then we get ads.
+ // You can also easily test cancelling and reloading by running
+ // player.ads.cancel() and player.ads.play from the console I guess.
+ // this.player.source = {
+ // type: 'video',
+ // title: 'View From A Blue Moon',
+ // sources: [{
+ // src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
+ // 'video/mp4', }], poster:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
+ // [ { kind: 'captions', label: 'English', srclang: 'en', src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
+ // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
+ // };
+ // TODO: So there is still this thing where a video should only be allowed to start
+ // playing when the IMA SDK is ready or has failed
+
+ this.loadAds();
+ break;
+
+ case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
+ // This event indicates the ad has started - the video player can adjust the UI,
+ // for example display a pause button and remaining time. Fired when content should
+ // be paused. This usually happens right before an ad is about to cover the content
+ dispatchEvent(event.type);
+ this.pauseContent();
+ break;
+
+ case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
+ // This event indicates the ad has finished - the video player can perform
+ // appropriate UI actions, such as removing the timer for remaining time detection.
+ // Fired when content should be resumed. This usually happens when an ad finishes
+ // or collapses
+ dispatchEvent(event.type);
+ this.pollCountdown();
+ this.resumeContent();
+ break;
+
+ case google.ima.AdEvent.Type.STARTED:
+ case google.ima.AdEvent.Type.MIDPOINT:
+ case google.ima.AdEvent.Type.COMPLETE:
+ case google.ima.AdEvent.Type.IMPRESSION:
+ case google.ima.AdEvent.Type.CLICK:
+ dispatchEvent(event.type);
+ break;
+
+ default:
+ break;
+ }
+ }
+ /**
+ * Any ad error handling comes through here
+ * @param {Event} event
+ */
+
+ }, {
+ key: "onAdError",
+ value: function onAdError(event) {
+ this.cancel();
+ this.player.debug.warn('Ads error', event);
+ }
+ /**
+ * Setup hooks for Plyr and window events. This ensures
+ * the mid- and post-roll launch at the correct time. And
+ * resize the advertisement when the player resizes
+ */
+
+ }, {
+ key: "listeners",
+ value: function listeners() {
+ var _this8 = this;
+
+ var container = this.player.elements.container;
+ var time; // Add listeners to the required events
+
+ this.player.on('ended', function () {
+ _this8.loader.contentComplete();
+ });
+ this.player.on('seeking', function () {
+ time = _this8.player.currentTime;
+ return time;
+ });
+ this.player.on('seeked', function () {
+ var seekedTime = _this8.player.currentTime;
- if (!start) {
- clearInterval(this.countdownTimer);
- this.elements.container.removeAttribute('data-badge-text');
- return;
- }
+ if (is.empty(_this8.cuePoints)) {
+ return;
+ }
- var update = function update() {
- var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
- var label = i18n.get('advertisement', _this5.player.config) + ' - ' + time;
- _this5.elements.container.setAttribute('data-badge-text', label);
- };
+ _this8.cuePoints.forEach(function (cuePoint, index) {
+ if (time < cuePoint && cuePoint < seekedTime) {
+ _this8.manager.discardAdBreak();
- this.countdownTimer = setInterval(update, 100);
+ _this8.cuePoints.splice(index, 1);
}
+ });
+ }); // Listen to the resizing of the window. And resize ad accordingly
+ // TODO: eventually implement ResizeObserver
- /**
- * This method is called whenever the ads are ready inside the AdDisplayContainer
- * @param {Event} adsManagerLoadedEvent
- */
-
- }, {
- key: 'onAdsManagerLoaded',
- value: function onAdsManagerLoaded(event) {
- var _this6 = this;
-
- // Load could occur after a source change (race condition)
- if (!this.enabled) {
- return;
- }
+ window.addEventListener('resize', function () {
+ if (_this8.manager) {
+ _this8.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ }
+ });
+ }
+ /**
+ * Initialize the adsManager and start playing advertisements
+ */
- // Get the ads manager
- var settings = new google.ima.AdsRenderingSettings();
-
- // Tell the SDK to save and restore content video state on our behalf
- settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
- settings.enablePreloading = true;
-
- // The SDK is polling currentTime on the contentPlayback. And needs a duration
- // so it can determine when to start the mid- and post-roll
- this.manager = event.getAdsManager(this.player, settings);
-
- // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
- this.cuePoints = this.manager.getCuePoints();
-
- // Add advertisement cue's within the time line if available
- if (!is.empty(this.cuePoints)) {
- this.cuePoints.forEach(function (cuePoint) {
- if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this6.player.duration) {
- var seekElement = _this6.player.elements.progress;
-
- if (is.element(seekElement)) {
- var cuePercentage = 100 / _this6.player.duration * cuePoint;
- var cue = createElement('span', {
- class: _this6.player.config.classNames.cues
- });
-
- cue.style.left = cuePercentage.toString() + '%';
- seekElement.appendChild(cue);
- }
- }
- });
- }
+ }, {
+ key: "play",
+ value: function play() {
+ var _this9 = this;
- // Set volume to match player
- this.manager.setVolume(this.player.volume);
+ var container = this.player.elements.container;
- // Add listeners to the required events
- // Advertisement error events
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this6.onAdError(error);
- });
+ if (!this.managerPromise) {
+ this.resumeContent();
+ } // Play the requested advertisement whenever the adsManager is ready
- // Advertisement regular events
- Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {
- return _this6.onAdEvent(event);
- });
- });
- // Resolve our adsManager
- this.trigger('loaded');
- }
+ this.managerPromise.then(function () {
+ // Initialize the container. Must be done via a user action on mobile devices
+ _this9.elements.displayContainer.initialize();
- /**
- * This is where all the event handling takes place. Retrieve the ad from the event. Some
- * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
- * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
- * @param {Event} event
- */
-
- }, {
- key: 'onAdEvent',
- value: function onAdEvent(event) {
- var _this7 = this;
-
- var container = this.player.elements.container;
-
- // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
- // don't have ad object associated
-
- var ad = event.getAd();
-
- // Proxy event
- var dispatchEvent = function dispatchEvent(type) {
- var event = 'ads' + type.replace(/_/g, '').toLowerCase();
- triggerEvent.call(_this7.player, _this7.player.media, event);
- };
-
- switch (event.type) {
- case google.ima.AdEvent.Type.LOADED:
- // This is the first event sent for an ad - it is possible to determine whether the
- // ad is a video ad or an overlay
- this.trigger('loaded');
-
- // Bubble event
- dispatchEvent(event.type);
-
- // Start countdown
- this.pollCountdown(true);
-
- if (!ad.isLinear()) {
- // Position AdDisplayContainer correctly for overlay
- ad.width = container.offsetWidth;
- ad.height = container.offsetHeight;
- }
-
- // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
- // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
- break;
-
- case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
- // All ads for the current videos are done. We can now request new advertisements
- // in case the video is re-played
-
- // Fire event
- dispatchEvent(event.type);
-
- // TODO: Example for what happens when a next video in a playlist would be loaded.
- // So here we load a new video when all ads are done.
- // Then we load new ads within a new adsManager. When the video
- // Is started - after - the ads are loaded, then we get ads.
- // You can also easily test cancelling and reloading by running
- // player.ads.cancel() and player.ads.play from the console I guess.
- // this.player.source = {
- // type: 'video',
- // title: 'View From A Blue Moon',
- // sources: [{
- // src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
- // 'video/mp4', }], poster:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
- // [ { kind: 'captions', label: 'English', srclang: 'en', src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
- // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
- // };
-
- // TODO: So there is still this thing where a video should only be allowed to start
- // playing when the IMA SDK is ready or has failed
-
- this.loadAds();
- break;
-
- case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
- // This event indicates the ad has started - the video player can adjust the UI,
- // for example display a pause button and remaining time. Fired when content should
- // be paused. This usually happens right before an ad is about to cover the content
-
- dispatchEvent(event.type);
-
- this.pauseContent();
-
- break;
-
- case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
- // This event indicates the ad has finished - the video player can perform
- // appropriate UI actions, such as removing the timer for remaining time detection.
- // Fired when content should be resumed. This usually happens when an ad finishes
- // or collapses
-
- dispatchEvent(event.type);
-
- this.pollCountdown();
-
- this.resumeContent();
-
- break;
-
- case google.ima.AdEvent.Type.STARTED:
- case google.ima.AdEvent.Type.MIDPOINT:
- case google.ima.AdEvent.Type.COMPLETE:
- case google.ima.AdEvent.Type.IMPRESSION:
- case google.ima.AdEvent.Type.CLICK:
- dispatchEvent(event.type);
- break;
-
- default:
- break;
- }
- }
+ try {
+ if (!_this9.initialized) {
+ // Initialize the ads manager. Ad rules playlist will start at this time
+ _this9.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
+ // start at this time; the call will be ignored for ad rules
- /**
- * Any ad error handling comes through here
- * @param {Event} event
- */
- }, {
- key: 'onAdError',
- value: function onAdError(event) {
- this.cancel();
- this.player.debug.warn('Ads error', event);
+ _this9.manager.start();
}
- /**
- * Setup hooks for Plyr and window events. This ensures
- * the mid- and post-roll launch at the correct time. And
- * resize the advertisement when the player resizes
- */
-
- }, {
- key: 'listeners',
- value: function listeners() {
- var _this8 = this;
+ _this9.initialized = true;
+ } catch (adError) {
+ // An error may be thrown if there was a problem with the
+ // VAST response
+ _this9.onAdError(adError);
+ }
+ }).catch(function () {});
+ }
+ /**
+ * Resume our video
+ */
- var container = this.player.elements.container;
+ }, {
+ key: "resumeContent",
+ value: function resumeContent() {
+ // Hide the advertisement container
+ this.elements.container.style.zIndex = ''; // Ad is stopped
- var time = void 0;
+ this.playing = false; // Play our video
- // Add listeners to the required events
- this.player.on('ended', function () {
- _this8.loader.contentComplete();
- });
+ if (this.player.currentTime < this.player.duration) {
+ this.player.play();
+ }
+ }
+ /**
+ * Pause our video
+ */
- this.player.on('seeking', function () {
- time = _this8.player.currentTime;
- return time;
- });
+ }, {
+ key: "pauseContent",
+ value: function pauseContent() {
+ // Show the advertisement container
+ this.elements.container.style.zIndex = 3; // Ad is playing.
- this.player.on('seeked', function () {
- var seekedTime = _this8.player.currentTime;
+ this.playing = true; // Pause our video.
- if (is.empty(_this8.cuePoints)) {
- return;
- }
+ this.player.pause();
+ }
+ /**
+ * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
+ * allowed to call new ads based on google policies, as they interpret this as an accidental
+ * video requests. https://developers.google.com/interactive-
+ * media-ads/docs/sdks/android/faq#8
+ */
- _this8.cuePoints.forEach(function (cuePoint, index) {
- if (time < cuePoint && cuePoint < seekedTime) {
- _this8.manager.discardAdBreak();
- _this8.cuePoints.splice(index, 1);
- }
- });
- });
+ }, {
+ key: "cancel",
+ value: function cancel() {
+ // Pause our video
+ if (this.initialized) {
+ this.resumeContent();
+ } // Tell our instance that we're done for now
- // Listen to the resizing of the window. And resize ad accordingly
- // TODO: eventually implement ResizeObserver
- window.addEventListener('resize', function () {
- if (_this8.manager) {
- _this8.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
- }
- });
- }
- /**
- * Initialize the adsManager and start playing advertisements
- */
+ this.trigger('error'); // Re-create our adsManager
- }, {
- key: 'play',
- value: function play() {
- var _this9 = this;
+ this.loadAds();
+ }
+ /**
+ * Re-create our adsManager
+ */
- var container = this.player.elements.container;
+ }, {
+ key: "loadAds",
+ value: function loadAds() {
+ var _this10 = this;
+ // Tell our adsManager to go bye bye
+ this.managerPromise.then(function () {
+ // Destroy our adsManager
+ if (_this10.manager) {
+ _this10.manager.destroy();
+ } // Re-set our adsManager promises
- if (!this.managerPromise) {
- this.resumeContent();
- }
- // Play the requested advertisement whenever the adsManager is ready
- this.managerPromise.then(function () {
- // Initialize the container. Must be done via a user action on mobile devices
- _this9.elements.displayContainer.initialize();
-
- try {
- if (!_this9.initialized) {
- // Initialize the ads manager. Ad rules playlist will start at this time
- _this9.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
-
- // Call play to start showing the ad. Single video and overlay ads will
- // start at this time; the call will be ignored for ad rules
- _this9.manager.start();
- }
-
- _this9.initialized = true;
- } catch (adError) {
- // An error may be thrown if there was a problem with the
- // VAST response
- _this9.onAdError(adError);
- }
- }).catch(function () {});
- }
+ _this10.managerPromise = new Promise(function (resolve) {
+ _this10.on('loaded', resolve);
- /**
- * Resume our video
- */
+ _this10.player.debug.log(_this10.manager);
+ }); // Now request some new advertisements
- }, {
- key: 'resumeContent',
- value: function resumeContent() {
- // Hide the advertisement container
- this.elements.container.style.zIndex = '';
+ _this10.requestAds();
+ }).catch(function () {});
+ }
+ /**
+ * Handles callbacks after an ad event was invoked
+ * @param {string} event - Event type
+ */
+
+ }, {
+ key: "trigger",
+ value: function trigger(event) {
+ var _this11 = this;
+
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
- // Ad is stopped
- this.playing = false;
+ var handlers = this.events[event];
- // Play our video
- if (this.player.currentTime < this.player.duration) {
- this.player.play();
- }
+ if (is.array(handlers)) {
+ handlers.forEach(function (handler) {
+ if (is.function(handler)) {
+ handler.apply(_this11, args);
}
+ });
+ }
+ }
+ /**
+ * Add event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ * @return {Ads}
+ */
+
+ }, {
+ key: "on",
+ value: function on$$1(event, callback) {
+ if (!is.array(this.events[event])) {
+ this.events[event] = [];
+ }
- /**
- * Pause our video
- */
+ this.events[event].push(callback);
+ return this;
+ }
+ /**
+ * Setup a safety timer for when the ad network doesn't respond for whatever reason.
+ * The advertisement has 12 seconds to get its things together. We stop this timer when the
+ * advertisement is playing, or when a user action is required to start, then we clear the
+ * timer on ad ready
+ * @param {number} time
+ * @param {string} from
+ */
+
+ }, {
+ key: "startSafetyTimer",
+ value: function startSafetyTimer(time, from) {
+ var _this12 = this;
+
+ this.player.debug.log("Safety timer invoked from: ".concat(from));
+ this.safetyTimer = setTimeout(function () {
+ _this12.cancel();
+
+ _this12.clearSafetyTimer('startSafetyTimer()');
+ }, time);
+ }
+ /**
+ * Clear our safety timer(s)
+ * @param {string} from
+ */
+
+ }, {
+ key: "clearSafetyTimer",
+ value: function clearSafetyTimer(from) {
+ if (!is.nullOrUndefined(this.safetyTimer)) {
+ this.player.debug.log("Safety timer cleared from: ".concat(from));
+ clearTimeout(this.safetyTimer);
+ this.safetyTimer = null;
+ }
+ }
+ }, {
+ key: "enabled",
+ get: function get() {
+ return this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);
+ }
+ }, {
+ key: "tagUrl",
+ get: function get() {
+ var params = {
+ AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
+ AV_CHANNELID: '5a0458dc28a06145e4519d21',
+ AV_URL: window.location.hostname,
+ cb: Date.now(),
+ AV_WIDTH: 640,
+ AV_HEIGHT: 480,
+ AV_CDIM2: this.publisherId
+ };
+ var base = 'https://go.aniview.com/api/adserver6/vast/';
+ return "".concat(base, "?").concat(buildUrlParams(params));
+ }
+ }]);
- }, {
- key: 'pauseContent',
- value: function pauseContent() {
- // Show the advertisement container
- this.elements.container.style.zIndex = 3;
+ return Ads;
+ }();
- // Ad is playing.
- this.playing = true;
+ var source = {
+ // Add elements to HTML5 media (source, tracks, etc)
+ insertElements: function insertElements(type, attributes) {
+ var _this = this;
- // Pause our video.
- this.player.pause();
- }
+ if (is.string(attributes)) {
+ insertElement(type, this.media, {
+ src: attributes
+ });
+ } else if (is.array(attributes)) {
+ attributes.forEach(function (attribute) {
+ insertElement(type, _this.media, attribute);
+ });
+ }
+ },
+ // Update source
+ // Sources are not checked for support so be careful
+ change: function change(input) {
+ var _this2 = this;
- /**
- * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
- * allowed to call new ads based on google policies, as they interpret this as an accidental
- * video requests. https://developers.google.com/interactive-
- * media-ads/docs/sdks/android/faq#8
- */
-
- }, {
- key: 'cancel',
- value: function cancel() {
- // Pause our video
- if (this.initialized) {
- this.resumeContent();
- }
+ if (!getDeep(input, 'sources.length')) {
+ this.debug.warn('Invalid source format');
+ return;
+ } // Cancel current network requests
- // Tell our instance that we're done for now
- this.trigger('error');
- // Re-create our adsManager
- this.loadAds();
- }
+ html5.cancelRequests.call(this); // Destroy instance and re-setup
- /**
- * Re-create our adsManager
- */
-
- }, {
- key: 'loadAds',
- value: function loadAds() {
- var _this10 = this;
-
- // Tell our adsManager to go bye bye
- this.managerPromise.then(function () {
- // Destroy our adsManager
- if (_this10.manager) {
- _this10.manager.destroy();
- }
-
- // Re-set our adsManager promises
- _this10.managerPromise = new Promise(function (resolve) {
- _this10.on('loaded', resolve);
- _this10.player.debug.log(_this10.manager);
- });
-
- // Now request some new advertisements
- _this10.requestAds();
- }).catch(function () {});
- }
+ this.destroy.call(this, function () {
+ // Reset quality options
+ _this2.options.quality = []; // Remove elements
- /**
- * Handles callbacks after an ad event was invoked
- * @param {string} event - Event type
- */
+ removeElement(_this2.media);
+ _this2.media = null; // Reset class name
- }, {
- key: 'trigger',
- value: function trigger(event) {
- var _this11 = this;
+ if (is.element(_this2.elements.container)) {
+ _this2.elements.container.removeAttribute('class');
+ } // Set the type and provider
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
- var handlers = this.events[event];
+ var sources = input.sources,
+ type = input.type;
- if (is.array(handlers)) {
- handlers.forEach(function (handler) {
- if (is.function(handler)) {
- handler.apply(_this11, args);
- }
- });
- }
- }
+ var _sources = _slicedToArray(sources, 1),
+ _sources$ = _sources[0],
+ _sources$$provider = _sources$.provider,
+ provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,
+ src = _sources$.src;
- /**
- * Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- * @return {Ads}
- */
-
- }, {
- key: 'on',
- value: function on$$1(event, callback) {
- if (!is.array(this.events[event])) {
- this.events[event] = [];
- }
+ var tagName = provider === 'html5' ? type : 'div';
+ var attributes = provider === 'html5' ? {} : {
+ src: src
+ };
+ Object.assign(_this2, {
+ provider: provider,
+ type: type,
+ // Check for support
+ supported: support.check(type, provider, _this2.config.playsinline),
+ // Create new element
+ media: createElement(tagName, attributes)
+ }); // Inject the new element
- this.events[event].push(callback);
+ _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?
- return this;
- }
- /**
- * Setup a safety timer for when the ad network doesn't respond for whatever reason.
- * The advertisement has 12 seconds to get its things together. We stop this timer when the
- * advertisement is playing, or when a user action is required to start, then we clear the
- * timer on ad ready
- * @param {number} time
- * @param {string} from
- */
-
- }, {
- key: 'startSafetyTimer',
- value: function startSafetyTimer(time, from) {
- var _this12 = this;
-
- this.player.debug.log('Safety timer invoked from: ' + from);
-
- this.safetyTimer = setTimeout(function () {
- _this12.cancel();
- _this12.clearSafetyTimer('startSafetyTimer()');
- }, time);
- }
-
- /**
- * Clear our safety timer(s)
- * @param {string} from
- */
+ if (is.boolean(input.autoplay)) {
+ _this2.config.autoplay = input.autoplay;
+ } // Set attributes for audio and video
- }, {
- key: 'clearSafetyTimer',
- value: function clearSafetyTimer(from) {
- if (!is.nullOrUndefined(this.safetyTimer)) {
- this.player.debug.log('Safety timer cleared from: ' + from);
- clearTimeout(this.safetyTimer);
- this.safetyTimer = null;
- }
- }
- }, {
- key: 'enabled',
- get: function get$$1() {
- return this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);
- }
- }, {
- key: 'tagUrl',
- get: function get$$1() {
- var params = {
- AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
- AV_CHANNELID: '5a0458dc28a06145e4519d21',
- AV_URL: window.location.hostname,
- cb: Date.now(),
- AV_WIDTH: 640,
- AV_HEIGHT: 480,
- AV_CDIM2: this.publisherId
- };
-
- var base = 'https://go.aniview.com/api/adserver6/vast/';
-
- return base + '?' + buildUrlParams(params);
- }
- }]);
- return Ads;
- }();
+ if (_this2.isHTML5) {
+ if (_this2.config.crossorigin) {
+ _this2.media.setAttribute('crossorigin', '');
+ }
- // ==========================================================================
+ if (_this2.config.autoplay) {
+ _this2.media.setAttribute('autoplay', '');
+ }
- var source = {
- // Add elements to HTML5 media (source, tracks, etc)
- insertElements: function insertElements(type, attributes) {
- var _this = this;
+ if (!is.empty(input.poster)) {
+ _this2.poster = input.poster;
+ }
- if (is.string(attributes)) {
- insertElement(type, this.media, {
- src: attributes
- });
- } else if (is.array(attributes)) {
- attributes.forEach(function (attribute) {
- insertElement(type, _this.media, attribute);
- });
- }
- },
+ if (_this2.config.loop.active) {
+ _this2.media.setAttribute('loop', '');
+ }
+ if (_this2.config.muted) {
+ _this2.media.setAttribute('muted', '');
+ }
- // Update source
- // Sources are not checked for support so be careful
- change: function change(input) {
- var _this2 = this;
+ if (_this2.config.playsinline) {
+ _this2.media.setAttribute('playsinline', '');
+ }
+ } // Restore class hook
- if (!getDeep(input, 'sources.length')) {
- this.debug.warn('Invalid source format');
- return;
- }
- // Cancel current network requests
- html5.cancelRequests.call(this);
+ ui.addStyleHook.call(_this2); // Set new sources for html5
- // Destroy instance and re-setup
- this.destroy.call(this, function () {
- // Reset quality options
- _this2.options.quality = [];
+ if (_this2.isHTML5) {
+ source.insertElements.call(_this2, 'source', sources);
+ } // Set video title
- // Remove elements
- removeElement(_this2.media);
- _this2.media = null;
- // Reset class name
- if (is.element(_this2.elements.container)) {
- _this2.elements.container.removeAttribute('class');
- }
+ _this2.config.title = input.title; // Set up from scratch
- // Set the type and provider
- var sources = input.sources,
- type = input.type;
-
- var _sources = slicedToArray(sources, 1),
- _sources$ = _sources[0],
- _sources$$provider = _sources$.provider,
- provider = _sources$$provider === undefined ? providers.html5 : _sources$$provider,
- src = _sources$.src;
-
- var tagName = provider === 'html5' ? type : 'div';
- var attributes = provider === 'html5' ? {} : { src: src };
-
- Object.assign(_this2, {
- provider: provider,
- type: type,
- // Check for support
- supported: support.check(type, provider, _this2.config.playsinline),
- // Create new element
- media: createElement(tagName, attributes)
- });
+ media.setup.call(_this2); // HTML5 stuff
- // Inject the new element
- _this2.elements.container.appendChild(_this2.media);
+ if (_this2.isHTML5) {
+ // Setup captions
+ if ('tracks' in input) {
+ source.insertElements.call(_this2, 'track', input.tracks);
+ } // Load HTML5 sources
- // Autoplay the new source?
- if (is.boolean(input.autoplay)) {
- _this2.config.autoplay = input.autoplay;
- }
- // Set attributes for audio and video
- if (_this2.isHTML5) {
- if (_this2.config.crossorigin) {
- _this2.media.setAttribute('crossorigin', '');
- }
- if (_this2.config.autoplay) {
- _this2.media.setAttribute('autoplay', '');
- }
- if (!is.empty(input.poster)) {
- _this2.poster = input.poster;
- }
- if (_this2.config.loop.active) {
- _this2.media.setAttribute('loop', '');
- }
- if (_this2.config.muted) {
- _this2.media.setAttribute('muted', '');
- }
- if (_this2.config.playsinline) {
- _this2.media.setAttribute('playsinline', '');
- }
- }
+ _this2.media.load();
+ } // If HTML5 or embed but not fully supported, setupInterface and call ready now
- // Restore class hook
- ui.addStyleHook.call(_this2);
- // Set new sources for html5
- if (_this2.isHTML5) {
- source.insertElements.call(_this2, 'source', sources);
- }
+ if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
+ // Setup interface
+ ui.build.call(_this2);
+ } // Update the fullscreen support
- // Set video title
- _this2.config.title = input.title;
- // Set up from scratch
- media.setup.call(_this2);
+ _this2.fullscreen.update();
+ }, true);
+ }
+ };
- // HTML5 stuff
- if (_this2.isHTML5) {
- // Setup captions
- if ('tracks' in input) {
- source.insertElements.call(_this2, 'track', input.tracks);
- }
+ // TODO: Use a WeakMap for private globals
+ // const globals = new WeakMap();
+ // Plyr instance
- // Load HTML5 sources
- _this2.media.load();
- }
+ var Plyr =
+ /*#__PURE__*/
+ function () {
+ function Plyr(target, options) {
+ var _this = this;
- // If HTML5 or embed but not fully supported, setupInterface and call ready now
- if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
- // Setup interface
- ui.build.call(_this2);
- }
+ _classCallCheck(this, Plyr);
- // Update the fullscreen support
- _this2.fullscreen.update();
- }, true);
- }
- };
+ this.timers = {}; // State
- // ==========================================================================
+ this.ready = false;
+ this.loading = false;
+ this.failed = false; // Touch device
- // Private properties
- // TODO: Use a WeakMap for private globals
- // const globals = new WeakMap();
+ this.touch = support.touch; // Set the media element
- // Plyr instance
+ this.media = target; // String selector passed
- var Plyr = function () {
- function Plyr(target, options) {
- var _this = this;
+ if (is.string(this.media)) {
+ this.media = document.querySelectorAll(this.media);
+ } // jQuery, NodeList or Array passed, use first element
- classCallCheck(this, Plyr);
- this.timers = {};
+ if (window.jQuery && this.media instanceof jQuery || is.nodeList(this.media) || is.array(this.media)) {
+ // eslint-disable-next-line
+ this.media = this.media[0];
+ } // Set config
- // State
- this.ready = false;
- this.loading = false;
- this.failed = false;
- // Touch device
- this.touch = support.touch;
+ this.config = extend({}, defaults, Plyr.defaults, options || {}, function () {
+ try {
+ return JSON.parse(_this.media.getAttribute('data-plyr-config'));
+ } catch (e) {
+ return {};
+ }
+ }()); // Elements cache
+
+ this.elements = {
+ container: null,
+ captions: null,
+ buttons: {},
+ display: {},
+ progress: {},
+ inputs: {},
+ settings: {
+ popup: null,
+ menu: null,
+ panels: {},
+ buttons: {}
+ }
+ }; // Captions
- // Set the media element
- this.media = target;
+ this.captions = {
+ active: null,
+ currentTrack: -1,
+ meta: new WeakMap()
+ }; // Fullscreen
- // String selector passed
- if (is.string(this.media)) {
- this.media = document.querySelectorAll(this.media);
- }
+ this.fullscreen = {
+ active: false
+ }; // Options
- // jQuery, NodeList or Array passed, use first element
- if (window.jQuery && this.media instanceof jQuery || is.nodeList(this.media) || is.array(this.media)) {
- // eslint-disable-next-line
- this.media = this.media[0];
- }
+ this.options = {
+ speed: [],
+ quality: []
+ }; // Debugging
+ // TODO: move to globals
- // Set config
- this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {
- try {
- return JSON.parse(_this.media.getAttribute('data-plyr-config'));
- } catch (e) {
- return {};
- }
- }());
-
- // Elements cache
- this.elements = {
- container: null,
- captions: null,
- buttons: {},
- display: {},
- progress: {},
- inputs: {},
- settings: {
- popup: null,
- menu: null,
- panels: {},
- buttons: {}
- }
- };
+ this.debug = new Console(this.config.debug); // Log config options and support
- // Captions
- this.captions = {
- active: null,
- currentTrack: -1,
- meta: new WeakMap()
- };
+ this.debug.log('Config', this.config);
+ this.debug.log('Support', support); // We need an element to setup
- // Fullscreen
- this.fullscreen = {
- active: false
- };
+ if (is.nullOrUndefined(this.media) || !is.element(this.media)) {
+ this.debug.error('Setup failed: no suitable element passed');
+ return;
+ } // Bail if the element is initialized
- // Options
- this.options = {
- speed: [],
- quality: []
- };
- // Debugging
- // TODO: move to globals
- this.debug = new Console(this.config.debug);
+ if (this.media.plyr) {
+ this.debug.warn('Target already setup');
+ return;
+ } // Bail if not enabled
- // Log config options and support
- this.debug.log('Config', this.config);
- this.debug.log('Support', support);
- // We need an element to setup
- if (is.nullOrUndefined(this.media) || !is.element(this.media)) {
- this.debug.error('Setup failed: no suitable element passed');
- return;
- }
+ if (!this.config.enabled) {
+ this.debug.error('Setup failed: disabled by config');
+ return;
+ } // Bail if disabled or no basic support
+ // You may want to disable certain UAs etc
- // Bail if the element is initialized
- if (this.media.plyr) {
- this.debug.warn('Target already setup');
- return;
- }
- // Bail if not enabled
- if (!this.config.enabled) {
- this.debug.error('Setup failed: disabled by config');
- return;
- }
+ if (!support.check().api) {
+ this.debug.error('Setup failed: no support');
+ return;
+ } // Cache original element state for .destroy()
- // Bail if disabled or no basic support
- // You may want to disable certain UAs etc
- if (!support.check().api) {
- this.debug.error('Setup failed: no support');
- return;
- }
- // Cache original element state for .destroy()
- var clone = this.media.cloneNode(true);
- clone.autoplay = false;
- this.elements.original = clone;
-
- // Set media type based on tag or data attribute
- // Supported: video, audio, vimeo, youtube
- var type = this.media.tagName.toLowerCase();
-
- // Embed properties
- var iframe = null;
- var url = null;
-
- // Different setup based on type
- switch (type) {
- case 'div':
- // Find the frame
- iframe = this.media.querySelector('iframe');
-
- // <iframe> type
- if (is.element(iframe)) {
- // Detect provider
- url = parseUrl(iframe.getAttribute('src'));
- this.provider = getProviderByUrl(url.toString());
-
- // Rework elements
- this.elements.container = this.media;
- this.media = iframe;
-
- // Reset classname
- this.elements.container.className = '';
-
- // Get attributes from URL and set config
- if (url.search.length) {
- var truthy = ['1', 'true'];
-
- if (truthy.includes(url.searchParams.get('autoplay'))) {
- this.config.autoplay = true;
- }
- if (truthy.includes(url.searchParams.get('loop'))) {
- this.config.loop.active = true;
- }
-
- // TODO: replace fullscreen.iosNative with this playsinline config option
- // YouTube requires the playsinline in the URL
- if (this.isYouTube) {
- this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
- this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?
- } else {
- this.config.playsinline = true;
- }
- }
- } else {
- // <div> with attributes
- this.provider = this.media.getAttribute(this.config.attributes.embed.provider);
-
- // Remove attribute
- this.media.removeAttribute(this.config.attributes.embed.provider);
- }
-
- // Unsupported or missing provider
- if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
- this.debug.error('Setup failed: Invalid provider');
- return;
- }
-
- // Audio will come later for external providers
- this.type = types.video;
-
- break;
-
- case 'video':
- case 'audio':
- this.type = type;
- this.provider = providers.html5;
-
- // Get config from attributes
- if (this.media.hasAttribute('crossorigin')) {
- this.config.crossorigin = true;
- }
- if (this.media.hasAttribute('autoplay')) {
- this.config.autoplay = true;
- }
- if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {
- this.config.playsinline = true;
- }
- if (this.media.hasAttribute('muted')) {
- this.config.muted = true;
- }
- if (this.media.hasAttribute('loop')) {
- this.config.loop.active = true;
- }
-
- break;
-
- default:
- this.debug.error('Setup failed: unsupported type');
- return;
- }
+ var clone = this.media.cloneNode(true);
+ clone.autoplay = false;
+ this.elements.original = clone; // Set media type based on tag or data attribute
+ // Supported: video, audio, vimeo, youtube
- // Check for support again but with type
- this.supported = support.check(this.type, this.provider, this.config.playsinline);
+ var type = this.media.tagName.toLowerCase(); // Embed properties
- // If no support for even API, bail
- if (!this.supported.api) {
- this.debug.error('Setup failed: no support');
- return;
- }
+ var iframe = null;
+ var url = null; // Different setup based on type
- this.eventListeners = [];
+ switch (type) {
+ case 'div':
+ // Find the frame
+ iframe = this.media.querySelector('iframe'); // <iframe> type
- // Create listeners
- this.listeners = new Listeners(this);
+ if (is.element(iframe)) {
+ // Detect provider
+ url = parseUrl(iframe.getAttribute('src'));
+ this.provider = getProviderByUrl(url.toString()); // Rework elements
- // Setup local storage for user settings
- this.storage = new Storage(this);
+ this.elements.container = this.media;
+ this.media = iframe; // Reset classname
- // Store reference
- this.media.plyr = this;
+ this.elements.container.className = ''; // Get attributes from URL and set config
- // Wrap media
- if (!is.element(this.elements.container)) {
- this.elements.container = createElement('div');
- wrap(this.media, this.elements.container);
- }
+ if (url.search.length) {
+ var truthy = ['1', 'true'];
- // Add style hook
- ui.addStyleHook.call(this);
+ if (truthy.includes(url.searchParams.get('autoplay'))) {
+ this.config.autoplay = true;
+ }
- // Setup media
- media.setup.call(this);
+ if (truthy.includes(url.searchParams.get('loop'))) {
+ this.config.loop.active = true;
+ } // TODO: replace fullscreen.iosNative with this playsinline config option
+ // YouTube requires the playsinline in the URL
- // Listen for events if debugging
- if (this.config.debug) {
- on.call(this, this.elements.container, this.config.events.join(' '), function (event) {
- _this.debug.log('event: ' + event.type);
- });
- }
- // Setup interface
- // If embed but not fully supported, build interface now to avoid flash of controls
- if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
- ui.build.call(this);
+ if (this.isYouTube) {
+ this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
+ this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?
+ } else {
+ this.config.playsinline = true;
+ }
}
+ } else {
+ // <div> with attributes
+ this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute
- // Container listeners
- this.listeners.container();
-
- // Global listeners
- this.listeners.global();
+ this.media.removeAttribute(this.config.attributes.embed.provider);
+ } // Unsupported or missing provider
- // Setup fullscreen
- this.fullscreen = new Fullscreen(this);
- // Setup ads if provided
- if (this.config.ads.enabled) {
- this.ads = new Ads(this);
- }
-
- // Autoplay if required
- if (this.config.autoplay) {
- this.play();
- }
- }
-
- // ---------------------------------------
- // API
- // ---------------------------------------
-
- /**
- * Types and provider helpers
- */
-
-
- createClass(Plyr, [{
- key: 'play',
+ if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ this.debug.error('Setup failed: Invalid provider');
+ return;
+ } // Audio will come later for external providers
- /**
- * Play the media, or play the advertisement (if they are not blocked)
- */
- value: function play() {
- if (!is.function(this.media.play)) {
- return null;
- }
+ this.type = types.video;
+ break;
- // Return the promise (for HTML5)
- return this.media.play();
- }
+ case 'video':
+ case 'audio':
+ this.type = type;
+ this.provider = providers.html5; // Get config from attributes
- /**
- * Pause the media
- */
+ if (this.media.hasAttribute('crossorigin')) {
+ this.config.crossorigin = true;
+ }
- }, {
- key: 'pause',
- value: function pause() {
- if (!this.playing || !is.function(this.media.pause)) {
- return;
- }
+ if (this.media.hasAttribute('autoplay')) {
+ this.config.autoplay = true;
+ }
- this.media.pause();
- }
+ if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {
+ this.config.playsinline = true;
+ }
- /**
- * Get playing state
- */
+ if (this.media.hasAttribute('muted')) {
+ this.config.muted = true;
+ }
- }, {
- key: 'togglePlay',
+ if (this.media.hasAttribute('loop')) {
+ this.config.loop.active = true;
+ }
+ break;
- /**
- * Toggle playback based on current status
- * @param {boolean} input
- */
- value: function togglePlay(input) {
- // Toggle based on current state if nothing passed
- var toggle = is.boolean(input) ? input : !this.playing;
+ default:
+ this.debug.error('Setup failed: unsupported type');
+ return;
+ } // Check for support again but with type
- if (toggle) {
- this.play();
- } else {
- this.pause();
- }
- }
- /**
- * Stop playback
- */
-
- }, {
- key: 'stop',
- value: function stop() {
- if (this.isHTML5) {
- this.pause();
- this.restart();
- } else if (is.function(this.media.stop)) {
- this.media.stop();
- }
- }
+ this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail
- /**
- * Restart playback
- */
+ if (!this.supported.api) {
+ this.debug.error('Setup failed: no support');
+ return;
+ }
- }, {
- key: 'restart',
- value: function restart() {
- this.currentTime = 0;
- }
+ this.eventListeners = []; // Create listeners
- /**
- * Rewind
- * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
- */
+ this.listeners = new Listeners(this); // Setup local storage for user settings
- }, {
- key: 'rewind',
- value: function rewind(seekTime) {
- this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);
- }
+ this.storage = new Storage(this); // Store reference
- /**
- * Fast forward
- * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
- */
+ this.media.plyr = this; // Wrap media
- }, {
- key: 'forward',
- value: function forward(seekTime) {
- this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);
- }
+ if (!is.element(this.elements.container)) {
+ this.elements.container = createElement('div');
+ wrap(this.media, this.elements.container);
+ } // Add style hook
- /**
- * Seek to a time
- * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)
- */
- }, {
- key: 'increaseVolume',
+ ui.addStyleHook.call(this); // Setup media
+ media.setup.call(this); // Listen for events if debugging
- /**
- * Increase volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
- */
- value: function increaseVolume(step) {
- var volume = this.media.muted ? 0 : this.volume;
- this.volume = volume + (is.number(step) ? step : 0);
- }
+ if (this.config.debug) {
+ on.call(this, this.elements.container, this.config.events.join(' '), function (event) {
+ _this.debug.log("event: ".concat(event.type));
+ });
+ } // Setup interface
+ // If embed but not fully supported, build interface now to avoid flash of controls
- /**
- * Decrease volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
- */
- }, {
- key: 'decreaseVolume',
- value: function decreaseVolume(step) {
- this.increaseVolume(-step);
- }
+ if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
+ ui.build.call(this);
+ } // Container listeners
- /**
- * Set muted state
- * @param {boolean} mute
- */
- }, {
- key: 'toggleCaptions',
+ this.listeners.container(); // Global listeners
+ this.listeners.global(); // Setup fullscreen
- /**
- * Toggle captions
- * @param {boolean} input - Whether to enable captions
- */
- value: function toggleCaptions(input) {
- captions.toggle.call(this, input, false);
- }
+ this.fullscreen = new Fullscreen(this); // Setup ads if provided
- /**
- * Set the caption track by index
- * @param {number} - Caption index
- */
+ if (this.config.ads.enabled) {
+ this.ads = new Ads(this);
+ } // Autoplay if required
- }, {
- key: 'airplay',
+ if (this.config.autoplay) {
+ this.play();
+ }
+ } // ---------------------------------------
+ // API
+ // ---------------------------------------
- /**
- * Trigger the airplay dialog
- * TODO: update player with state, support, enabled
- */
- value: function airplay() {
- // Show dialog if supported
- if (support.airplay) {
- this.media.webkitShowPlaybackTargetPicker();
- }
- }
+ /**
+ * Types and provider helpers
+ */
- /**
- * Toggle the player controls
- * @param {boolean} [toggle] - Whether to show the controls
- */
-
- }, {
- key: 'toggleControls',
- value: function toggleControls(toggle) {
- // Don't toggle if missing UI support or if it's audio
- if (this.supported.ui && !this.isAudio) {
- // Get state before change
- var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);
-
- // Negate the argument if not undefined since adding the class to hides the controls
- var force = typeof toggle === 'undefined' ? undefined : !toggle;
-
- // Apply and get updated state
- var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);
-
- // Close menu
- if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {
- controls.toggleMenu.call(this, false);
- }
-
- // Trigger event on change
- if (hiding !== isHidden) {
- var eventName = hiding ? 'controlshidden' : 'controlsshown';
- triggerEvent.call(this, this.media, eventName);
- }
-
- return !hiding;
- }
- return false;
- }
+ _createClass(Plyr, [{
+ key: "play",
- /**
- * Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
+ /**
+ * Play the media, or play the advertisement (if they are not blocked)
+ */
+ value: function play() {
+ if (!is.function(this.media.play)) {
+ return null;
+ } // Return the promise (for HTML5)
- }, {
- key: 'on',
- value: function on$$1(event, callback) {
- on.call(this, this.elements.container, event, callback);
- }
- /**
- * Add event listeners once
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
+ return this.media.play();
+ }
+ /**
+ * Pause the media
+ */
+
+ }, {
+ key: "pause",
+ value: function pause() {
+ if (!this.playing || !is.function(this.media.pause)) {
+ return;
+ }
- }, {
- key: 'once',
- value: function once$$1(event, callback) {
- once.call(this, this.elements.container, event, callback);
- }
+ this.media.pause();
+ }
+ /**
+ * Get playing state
+ */
- /**
- * Remove event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
+ }, {
+ key: "togglePlay",
- }, {
- key: 'off',
- value: function off$$1(event, callback) {
- off(this.elements.container, event, callback);
- }
+ /**
+ * Toggle playback based on current status
+ * @param {boolean} input
+ */
+ value: function togglePlay(input) {
+ // Toggle based on current state if nothing passed
+ var toggle = is.boolean(input) ? input : !this.playing;
- /**
- * Destroy an instance
- * Event listeners are removed when elements are removed
- * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
- * @param {function} callback - Callback for when destroy is complete
- * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)
- */
+ if (toggle) {
+ this.play();
+ } else {
+ this.pause();
+ }
+ }
+ /**
+ * Stop playback
+ */
+
+ }, {
+ key: "stop",
+ value: function stop() {
+ if (this.isHTML5) {
+ this.pause();
+ this.restart();
+ } else if (is.function(this.media.stop)) {
+ this.media.stop();
+ }
+ }
+ /**
+ * Restart playback
+ */
+
+ }, {
+ key: "restart",
+ value: function restart() {
+ this.currentTime = 0;
+ }
+ /**
+ * Rewind
+ * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
+ */
+
+ }, {
+ key: "rewind",
+ value: function rewind(seekTime) {
+ this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);
+ }
+ /**
+ * Fast forward
+ * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
+ */
+
+ }, {
+ key: "forward",
+ value: function forward(seekTime) {
+ this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);
+ }
+ /**
+ * Seek to a time
+ * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)
+ */
+
+ }, {
+ key: "increaseVolume",
+
+ /**
+ * Increase volume
+ * @param {boolean} step - How much to decrease by (between 0 and 1)
+ */
+ value: function increaseVolume(step) {
+ var volume = this.media.muted ? 0 : this.volume;
+ this.volume = volume + (is.number(step) ? step : 0);
+ }
+ /**
+ * Decrease volume
+ * @param {boolean} step - How much to decrease by (between 0 and 1)
+ */
+
+ }, {
+ key: "decreaseVolume",
+ value: function decreaseVolume(step) {
+ this.increaseVolume(-step);
+ }
+ /**
+ * Set muted state
+ * @param {boolean} mute
+ */
+
+ }, {
+ key: "toggleCaptions",
+
+ /**
+ * Toggle captions
+ * @param {boolean} input - Whether to enable captions
+ */
+ value: function toggleCaptions(input) {
+ captions.toggle.call(this, input, false);
+ }
+ /**
+ * Set the caption track by index
+ * @param {number} - Caption index
+ */
+
+ }, {
+ key: "airplay",
+
+ /**
+ * Trigger the airplay dialog
+ * TODO: update player with state, support, enabled
+ */
+ value: function airplay() {
+ // Show dialog if supported
+ if (support.airplay) {
+ this.media.webkitShowPlaybackTargetPicker();
+ }
+ }
+ /**
+ * Toggle the player controls
+ * @param {boolean} [toggle] - Whether to show the controls
+ */
- }, {
- key: 'destroy',
- value: function destroy(callback) {
- var _this2 = this;
+ }, {
+ key: "toggleControls",
+ value: function toggleControls(toggle) {
+ // Don't toggle if missing UI support or if it's audio
+ if (this.supported.ui && !this.isAudio) {
+ // Get state before change
+ var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls
- var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state
- if (!this.ready) {
- return;
- }
+ var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu
- var done = function done() {
- // Reset overflow (incase destroyed while in fullscreen)
- document.body.style.overflow = '';
-
- // GC for embed
- _this2.embed = null;
-
- // If it's a soft destroy, make minimal changes
- if (soft) {
- if (Object.keys(_this2.elements).length) {
- // Remove elements
- removeElement(_this2.elements.buttons.play);
- removeElement(_this2.elements.captions);
- removeElement(_this2.elements.controls);
- removeElement(_this2.elements.wrapper);
-
- // Clear for GC
- _this2.elements.buttons.play = null;
- _this2.elements.captions = null;
- _this2.elements.controls = null;
- _this2.elements.wrapper = null;
- }
-
- // Callback
- if (is.function(callback)) {
- callback();
- }
- } else {
- // Unbind listeners
- unbindListeners.call(_this2);
-
- // Replace the container with the original element provided
- replaceElement(_this2.elements.original, _this2.elements.container);
-
- // Event
- triggerEvent.call(_this2, _this2.elements.original, 'destroyed', true);
-
- // Callback
- if (is.function(callback)) {
- callback.call(_this2.elements.original);
- }
-
- // Reset state
- _this2.ready = false;
-
- // Clear for garbage collection
- setTimeout(function () {
- _this2.elements = null;
- _this2.media = null;
- }, 200);
- }
- };
-
- // Stop playback
- this.stop();
-
- // Provider specific stuff
- if (this.isHTML5) {
- // Clear timeout
- clearTimeout(this.timers.loading);
-
- // Restore native video controls
- ui.toggleNativeControls.call(this, true);
-
- // Clean up
- done();
- } else if (this.isYouTube) {
- // Clear timers
- clearInterval(this.timers.buffering);
- clearInterval(this.timers.playing);
-
- // Destroy YouTube API
- if (this.embed !== null && is.function(this.embed.destroy)) {
- this.embed.destroy();
- }
-
- // Clean up
- done();
- } else if (this.isVimeo) {
- // Destroy Vimeo API
- // then clean up (wait, to prevent postmessage errors)
- if (this.embed !== null) {
- this.embed.unload().then(done);
- }
-
- // Vimeo does not always return
- setTimeout(done, 200);
- }
- }
+ if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {
+ controls.toggleMenu.call(this, false);
+ } // Trigger event on change
- /**
- * Check for support for a mime type (HTML5 only)
- * @param {string} type - Mime type
- */
- }, {
- key: 'supports',
- value: function supports(type) {
- return support.mime.call(this, type);
- }
+ if (hiding !== isHidden) {
+ var eventName = hiding ? 'controlshidden' : 'controlsshown';
+ triggerEvent.call(this, this.media, eventName);
+ }
- /**
- * Check for support
- * @param {string} type - Player type (audio/video)
- * @param {string} provider - Provider (html5/youtube/vimeo)
- * @param {bool} inline - Where player has `playsinline` sttribute
- */
-
- }, {
- key: 'isHTML5',
- get: function get$$1() {
- return Boolean(this.provider === providers.html5);
- }
- }, {
- key: 'isEmbed',
- get: function get$$1() {
- return Boolean(this.isYouTube || this.isVimeo);
- }
- }, {
- key: 'isYouTube',
- get: function get$$1() {
- return Boolean(this.provider === providers.youtube);
- }
- }, {
- key: 'isVimeo',
- get: function get$$1() {
- return Boolean(this.provider === providers.vimeo);
- }
- }, {
- key: 'isVideo',
- get: function get$$1() {
- return Boolean(this.type === types.video);
- }
- }, {
- key: 'isAudio',
- get: function get$$1() {
- return Boolean(this.type === types.audio);
- }
- }, {
- key: 'playing',
- get: function get$$1() {
- return Boolean(this.ready && !this.paused && !this.ended);
- }
+ return !hiding;
+ }
- /**
- * Get paused state
- */
+ return false;
+ }
+ /**
+ * Add event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: "on",
+ value: function on$$1(event, callback) {
+ on.call(this, this.elements.container, event, callback);
+ }
+ /**
+ * Add event listeners once
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: "once",
+ value: function once$$1(event, callback) {
+ once.call(this, this.elements.container, event, callback);
+ }
+ /**
+ * Remove event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: "off",
+ value: function off$$1(event, callback) {
+ off(this.elements.container, event, callback);
+ }
+ /**
+ * Destroy an instance
+ * Event listeners are removed when elements are removed
+ * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
+ * @param {function} callback - Callback for when destroy is complete
+ * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)
+ */
+
+ }, {
+ key: "destroy",
+ value: function destroy(callback) {
+ var _this2 = this;
- }, {
- key: 'paused',
- get: function get$$1() {
- return Boolean(this.media.paused);
- }
+ var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- /**
- * Get stopped state
- */
+ if (!this.ready) {
+ return;
+ }
- }, {
- key: 'stopped',
- get: function get$$1() {
- return Boolean(this.paused && this.currentTime === 0);
- }
+ var done = function done() {
+ // Reset overflow (incase destroyed while in fullscreen)
+ document.body.style.overflow = ''; // GC for embed
- /**
- * Get ended state
- */
+ _this2.embed = null; // If it's a soft destroy, make minimal changes
- }, {
- key: 'ended',
- get: function get$$1() {
- return Boolean(this.media.ended);
- }
- }, {
- key: 'currentTime',
- set: function set$$1(input) {
- // Bail if media duration isn't available yet
- if (!this.duration) {
- return;
- }
+ if (soft) {
+ if (Object.keys(_this2.elements).length) {
+ // Remove elements
+ removeElement(_this2.elements.buttons.play);
+ removeElement(_this2.elements.captions);
+ removeElement(_this2.elements.controls);
+ removeElement(_this2.elements.wrapper); // Clear for GC
- // Validate input
- var inputIsValid = is.number(input) && input > 0;
+ _this2.elements.buttons.play = null;
+ _this2.elements.captions = null;
+ _this2.elements.controls = null;
+ _this2.elements.wrapper = null;
+ } // Callback
- // Set
- this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;
- // Logging
- this.debug.log('Seeking to ' + this.currentTime + ' seconds');
+ if (is.function(callback)) {
+ callback();
}
+ } else {
+ // Unbind listeners
+ unbindListeners.call(_this2); // Replace the container with the original element provided
- /**
- * Get current time
- */
- ,
- get: function get$$1() {
- return Number(this.media.currentTime);
- }
+ replaceElement(_this2.elements.original, _this2.elements.container); // Event
- /**
- * Get buffered
- */
+ triggerEvent.call(_this2, _this2.elements.original, 'destroyed', true); // Callback
- }, {
- key: 'buffered',
- get: function get$$1() {
- var buffered = this.media.buffered;
+ if (is.function(callback)) {
+ callback.call(_this2.elements.original);
+ } // Reset state
- // YouTube / Vimeo return a float between 0-1
- if (is.number(buffered)) {
- return buffered;
- }
+ _this2.ready = false; // Clear for garbage collection
- // HTML5
- // TODO: Handle buffered chunks of the media
- // (i.e. seek to another section buffers only that section)
- if (buffered && buffered.length && this.duration > 0) {
- return buffered.end(0) / this.duration;
- }
+ setTimeout(function () {
+ _this2.elements = null;
+ _this2.media = null;
+ }, 200);
+ }
+ }; // Stop playback
- return 0;
- }
- /**
- * Get seeking status
- */
+ this.stop(); // Provider specific stuff
- }, {
- key: 'seeking',
- get: function get$$1() {
- return Boolean(this.media.seeking);
- }
+ if (this.isHTML5) {
+ // Clear timeout
+ clearTimeout(this.timers.loading); // Restore native video controls
- /**
- * Get the duration of the current media
- */
+ ui.toggleNativeControls.call(this, true); // Clean up
- }, {
- key: 'duration',
- get: function get$$1() {
- // Faux duration set via config
- var fauxDuration = parseFloat(this.config.duration);
+ done();
+ } else if (this.isYouTube) {
+ // Clear timers
+ clearInterval(this.timers.buffering);
+ clearInterval(this.timers.playing); // Destroy YouTube API
- // Media duration can be NaN or Infinity before the media has loaded
- var realDuration = (this.media || {}).duration;
- var duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;
+ if (this.embed !== null && is.function(this.embed.destroy)) {
+ this.embed.destroy();
+ } // Clean up
- // If config duration is funky, use regular duration
- return fauxDuration || duration;
- }
- /**
- * Set the player volume
- * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
- */
+ done();
+ } else if (this.isVimeo) {
+ // Destroy Vimeo API
+ // then clean up (wait, to prevent postmessage errors)
+ if (this.embed !== null) {
+ this.embed.unload().then(done);
+ } // Vimeo does not always return
- }, {
- key: 'volume',
- set: function set$$1(value) {
- var volume = value;
- var max = 1;
- var min = 0;
- if (is.string(volume)) {
- volume = Number(volume);
- }
+ setTimeout(done, 200);
+ }
+ }
+ /**
+ * Check for support for a mime type (HTML5 only)
+ * @param {string} type - Mime type
+ */
+
+ }, {
+ key: "supports",
+ value: function supports(type) {
+ return support.mime.call(this, type);
+ }
+ /**
+ * Check for support
+ * @param {string} type - Player type (audio/video)
+ * @param {string} provider - Provider (html5/youtube/vimeo)
+ * @param {bool} inline - Where player has `playsinline` sttribute
+ */
+
+ }, {
+ key: "isHTML5",
+ get: function get() {
+ return Boolean(this.provider === providers.html5);
+ }
+ }, {
+ key: "isEmbed",
+ get: function get() {
+ return Boolean(this.isYouTube || this.isVimeo);
+ }
+ }, {
+ key: "isYouTube",
+ get: function get() {
+ return Boolean(this.provider === providers.youtube);
+ }
+ }, {
+ key: "isVimeo",
+ get: function get() {
+ return Boolean(this.provider === providers.vimeo);
+ }
+ }, {
+ key: "isVideo",
+ get: function get() {
+ return Boolean(this.type === types.video);
+ }
+ }, {
+ key: "isAudio",
+ get: function get() {
+ return Boolean(this.type === types.audio);
+ }
+ }, {
+ key: "playing",
+ get: function get() {
+ return Boolean(this.ready && !this.paused && !this.ended);
+ }
+ /**
+ * Get paused state
+ */
+
+ }, {
+ key: "paused",
+ get: function get() {
+ return Boolean(this.media.paused);
+ }
+ /**
+ * Get stopped state
+ */
+
+ }, {
+ key: "stopped",
+ get: function get() {
+ return Boolean(this.paused && this.currentTime === 0);
+ }
+ /**
+ * Get ended state
+ */
+
+ }, {
+ key: "ended",
+ get: function get() {
+ return Boolean(this.media.ended);
+ }
+ }, {
+ key: "currentTime",
+ set: function set(input) {
+ // Bail if media duration isn't available yet
+ if (!this.duration) {
+ return;
+ } // Validate input
- // Load volume from storage if no value specified
- if (!is.number(volume)) {
- volume = this.storage.get('volume');
- }
- // Use config if all else fails
- if (!is.number(volume)) {
- volume = this.config.volume;
- }
+ var inputIsValid = is.number(input) && input > 0; // Set
- // Maximum is volumeMax
- if (volume > max) {
- volume = max;
- }
- // Minimum is volumeMin
- if (volume < min) {
- volume = min;
- }
+ this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging
- // Update config
- this.config.volume = volume;
+ this.debug.log("Seeking to ".concat(this.currentTime, " seconds"));
+ }
+ /**
+ * Get current time
+ */
+ ,
+ get: function get() {
+ return Number(this.media.currentTime);
+ }
+ /**
+ * Get buffered
+ */
- // Set the player volume
- this.media.volume = volume;
+ }, {
+ key: "buffered",
+ get: function get() {
+ var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1
- // If muted, and we're increasing volume manually, reset muted state
- if (!is.empty(value) && this.muted && volume > 0) {
- this.muted = false;
- }
- }
+ if (is.number(buffered)) {
+ return buffered;
+ } // HTML5
+ // TODO: Handle buffered chunks of the media
+ // (i.e. seek to another section buffers only that section)
- /**
- * Get the current player volume
- */
- ,
- get: function get$$1() {
- return Number(this.media.volume);
- }
- }, {
- key: 'muted',
- set: function set$$1(mute) {
- var toggle = mute;
-
- // Load muted state from storage
- if (!is.boolean(toggle)) {
- toggle = this.storage.get('muted');
- }
- // Use config if all else fails
- if (!is.boolean(toggle)) {
- toggle = this.config.muted;
- }
+ if (buffered && buffered.length && this.duration > 0) {
+ return buffered.end(0) / this.duration;
+ }
- // Update config
- this.config.muted = toggle;
+ return 0;
+ }
+ /**
+ * Get seeking status
+ */
+
+ }, {
+ key: "seeking",
+ get: function get() {
+ return Boolean(this.media.seeking);
+ }
+ /**
+ * Get the duration of the current media
+ */
- // Set mute on the player
- this.media.muted = toggle;
- }
+ }, {
+ key: "duration",
+ get: function get() {
+ // Faux duration set via config
+ var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded
- /**
- * Get current muted state
- */
- ,
- get: function get$$1() {
- return Boolean(this.media.muted);
- }
+ var realDuration = (this.media || {}).duration;
+ var duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration
- /**
- * Check if the media has audio
- */
+ return fauxDuration || duration;
+ }
+ /**
+ * Set the player volume
+ * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
+ */
- }, {
- key: 'hasAudio',
- get: function get$$1() {
- // Assume yes for all non HTML5 (as we can't tell...)
- if (!this.isHTML5) {
- return true;
- }
+ }, {
+ key: "volume",
+ set: function set(value) {
+ var volume = value;
+ var max = 1;
+ var min = 0;
- if (this.isAudio) {
- return true;
- }
+ if (is.string(volume)) {
+ volume = Number(volume);
+ } // Load volume from storage if no value specified
- // Get audio tracks
- return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
- }
- /**
- * Set playback speed
- * @param {number} speed - the speed of playback (0.5-2.0)
- */
+ if (!is.number(volume)) {
+ volume = this.storage.get('volume');
+ } // Use config if all else fails
- }, {
- key: 'speed',
- set: function set$$1(input) {
- var speed = null;
- if (is.number(input)) {
- speed = input;
- }
+ if (!is.number(volume)) {
+ volume = this.config.volume;
+ } // Maximum is volumeMax
- if (!is.number(speed)) {
- speed = this.storage.get('speed');
- }
- if (!is.number(speed)) {
- speed = this.config.speed.selected;
- }
+ if (volume > max) {
+ volume = max;
+ } // Minimum is volumeMin
- // Set min/max
- if (speed < 0.1) {
- speed = 0.1;
- }
- if (speed > 2.0) {
- speed = 2.0;
- }
- if (!this.config.speed.options.includes(speed)) {
- this.debug.warn('Unsupported speed (' + speed + ')');
- return;
- }
+ if (volume < min) {
+ volume = min;
+ } // Update config
- // Update config
- this.config.speed.selected = speed;
- // Set media speed
- this.media.playbackRate = speed;
- }
+ this.config.volume = volume; // Set the player volume
- /**
- * Get current playback speed
- */
- ,
- get: function get$$1() {
- return Number(this.media.playbackRate);
- }
+ this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state
- /**
- * Set playback quality
- * Currently HTML5 & YouTube only
- * @param {number} input - Quality level
- */
+ if (!is.empty(value) && this.muted && volume > 0) {
+ this.muted = false;
+ }
+ }
+ /**
+ * Get the current player volume
+ */
+ ,
+ get: function get() {
+ return Number(this.media.volume);
+ }
+ }, {
+ key: "muted",
+ set: function set(mute) {
+ var toggle = mute; // Load muted state from storage
- }, {
- key: 'quality',
- set: function set$$1(input) {
- var config = this.config.quality;
- var options = this.options.quality;
+ if (!is.boolean(toggle)) {
+ toggle = this.storage.get('muted');
+ } // Use config if all else fails
- if (!options.length) {
- return;
- }
- var quality = [!is.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is.number);
+ if (!is.boolean(toggle)) {
+ toggle = this.config.muted;
+ } // Update config
- if (!options.includes(quality)) {
- var value = closest(options, quality);
- this.debug.warn('Unsupported quality option: ' + quality + ', using ' + value + ' instead');
- quality = value;
- }
- // Update config
- config.selected = quality;
+ this.config.muted = toggle; // Set mute on the player
- // Set quality
- this.media.quality = quality;
- }
+ this.media.muted = toggle;
+ }
+ /**
+ * Get current muted state
+ */
+ ,
+ get: function get() {
+ return Boolean(this.media.muted);
+ }
+ /**
+ * Check if the media has audio
+ */
+
+ }, {
+ key: "hasAudio",
+ get: function get() {
+ // Assume yes for all non HTML5 (as we can't tell...)
+ if (!this.isHTML5) {
+ return true;
+ }
- /**
- * Get current quality level
- */
- ,
- get: function get$$1() {
- return this.media.quality;
- }
+ if (this.isAudio) {
+ return true;
+ } // Get audio tracks
- /**
- * Toggle loop
- * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
- * @param {boolean} input - Whether to loop or not
- */
-
- }, {
- key: 'loop',
- set: function set$$1(input) {
- var toggle = is.boolean(input) ? input : this.config.loop.active;
- this.config.loop.active = toggle;
- this.media.loop = toggle;
-
- // Set default to be a true toggle
- /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
- switch (type) {
- case 'start':
- if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
- this.config.loop.end = null;
- }
- this.config.loop.start = this.currentTime;
- // this.config.loop.indicator.start = this.elements.display.played.value;
- break;
- case 'end':
- if (this.config.loop.start >= this.currentTime) {
- return this;
- }
- this.config.loop.end = this.currentTime;
- // this.config.loop.indicator.end = this.elements.display.played.value;
- break;
- case 'all':
- this.config.loop.start = 0;
- this.config.loop.end = this.duration - 2;
- this.config.loop.indicator.start = 0;
- this.config.loop.indicator.end = 100;
- break;
- case 'toggle':
- if (this.config.loop.active) {
- this.config.loop.start = 0;
- this.config.loop.end = null;
- } else {
- this.config.loop.start = 0;
- this.config.loop.end = this.duration - 2;
- }
- break;
- default:
- this.config.loop.start = 0;
- this.config.loop.end = null;
- break;
- } */
- }
- /**
- * Get current loop state
- */
- ,
- get: function get$$1() {
- return Boolean(this.media.loop);
- }
+ return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
+ }
+ /**
+ * Set playback speed
+ * @param {number} speed - the speed of playback (0.5-2.0)
+ */
+
+ }, {
+ key: "speed",
+ set: function set(input) {
+ var speed = null;
+
+ if (is.number(input)) {
+ speed = input;
+ }
- /**
- * Set new media source
- * @param {object} input - The new source object (see docs)
- */
+ if (!is.number(speed)) {
+ speed = this.storage.get('speed');
+ }
- }, {
- key: 'source',
- set: function set$$1(input) {
- source.change.call(this, input);
- }
+ if (!is.number(speed)) {
+ speed = this.config.speed.selected;
+ } // Set min/max
- /**
- * Get current source
- */
- ,
- get: function get$$1() {
- return this.media.currentSrc;
- }
- /**
- * Set the poster image for a video
- * @param {input} - the URL for the new poster image
- */
-
- }, {
- key: 'poster',
- set: function set$$1(input) {
- if (!this.isVideo) {
- this.debug.warn('Poster can only be set for video');
- return;
- }
+ if (speed < 0.1) {
+ speed = 0.1;
+ }
- ui.setPoster.call(this, input, false).catch(function () {});
- }
+ if (speed > 2.0) {
+ speed = 2.0;
+ }
- /**
- * Get the current poster image
- */
- ,
- get: function get$$1() {
- if (!this.isVideo) {
- return null;
- }
+ if (!this.config.speed.options.includes(speed)) {
+ this.debug.warn("Unsupported speed (".concat(speed, ")"));
+ return;
+ } // Update config
- return this.media.getAttribute('poster');
- }
- /**
- * Set the autoplay state
- * @param {boolean} input - Whether to autoplay or not
- */
+ this.config.speed.selected = speed; // Set media speed
- }, {
- key: 'autoplay',
- set: function set$$1(input) {
- var toggle = is.boolean(input) ? input : this.config.autoplay;
- this.config.autoplay = toggle;
- }
+ this.media.playbackRate = speed;
+ }
+ /**
+ * Get current playback speed
+ */
+ ,
+ get: function get() {
+ return Number(this.media.playbackRate);
+ }
+ /**
+ * Set playback quality
+ * Currently HTML5 & YouTube only
+ * @param {number} input - Quality level
+ */
+
+ }, {
+ key: "quality",
+ set: function set(input) {
+ var config = this.config.quality;
+ var options = this.options.quality;
+
+ if (!options.length) {
+ return;
+ }
- /**
- * Get the current autoplay state
- */
- ,
- get: function get$$1() {
- return Boolean(this.config.autoplay);
- }
- }, {
- key: 'currentTrack',
- set: function set$$1(input) {
- captions.set.call(this, input, false);
- }
+ var quality = [!is.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is.number);
- /**
- * Get the current caption track index (-1 if disabled)
- */
- ,
- get: function get$$1() {
- var _captions = this.captions,
- toggled = _captions.toggled,
- currentTrack = _captions.currentTrack;
+ if (!options.includes(quality)) {
+ var value = closest(options, quality);
+ this.debug.warn("Unsupported quality option: ".concat(quality, ", using ").concat(value, " instead"));
+ quality = value;
+ } // Update config
- return toggled ? currentTrack : -1;
- }
- /**
- * Set the wanted language for captions
- * Since tracks can be added later it won't update the actual caption track until there is a matching track
- * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
- */
+ config.selected = quality; // Set quality
- }, {
- key: 'language',
- set: function set$$1(input) {
- captions.setLanguage.call(this, input, false);
- }
+ this.media.quality = quality;
+ }
+ /**
+ * Get current quality level
+ */
+ ,
+ get: function get() {
+ return this.media.quality;
+ }
+ /**
+ * Toggle loop
+ * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
+ * @param {boolean} input - Whether to loop or not
+ */
+
+ }, {
+ key: "loop",
+ set: function set(input) {
+ var toggle = is.boolean(input) ? input : this.config.loop.active;
+ this.config.loop.active = toggle;
+ this.media.loop = toggle; // Set default to be a true toggle
+
+ /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
+ switch (type) {
+ case 'start':
+ if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
+ this.config.loop.end = null;
+ }
+ this.config.loop.start = this.currentTime;
+ // this.config.loop.indicator.start = this.elements.display.played.value;
+ break;
+ case 'end':
+ if (this.config.loop.start >= this.currentTime) {
+ return this;
+ }
+ this.config.loop.end = this.currentTime;
+ // this.config.loop.indicator.end = this.elements.display.played.value;
+ break;
+ case 'all':
+ this.config.loop.start = 0;
+ this.config.loop.end = this.duration - 2;
+ this.config.loop.indicator.start = 0;
+ this.config.loop.indicator.end = 100;
+ break;
+ case 'toggle':
+ if (this.config.loop.active) {
+ this.config.loop.start = 0;
+ this.config.loop.end = null;
+ } else {
+ this.config.loop.start = 0;
+ this.config.loop.end = this.duration - 2;
+ }
+ break;
+ default:
+ this.config.loop.start = 0;
+ this.config.loop.end = null;
+ break;
+ } */
+ }
+ /**
+ * Get current loop state
+ */
+ ,
+ get: function get() {
+ return Boolean(this.media.loop);
+ }
+ /**
+ * Set new media source
+ * @param {object} input - The new source object (see docs)
+ */
+
+ }, {
+ key: "source",
+ set: function set(input) {
+ source.change.call(this, input);
+ }
+ /**
+ * Get current source
+ */
+ ,
+ get: function get() {
+ return this.media.currentSrc;
+ }
+ /**
+ * Set the poster image for a video
+ * @param {input} - the URL for the new poster image
+ */
+
+ }, {
+ key: "poster",
+ set: function set(input) {
+ if (!this.isVideo) {
+ this.debug.warn('Poster can only be set for video');
+ return;
+ }
- /**
- * Get the current track's language
- */
- ,
- get: function get$$1() {
- return (captions.getCurrentTrack.call(this) || {}).language;
- }
+ ui.setPoster.call(this, input, false).catch(function () {});
+ }
+ /**
+ * Get the current poster image
+ */
+ ,
+ get: function get() {
+ if (!this.isVideo) {
+ return null;
+ }
- /**
- * Toggle picture-in-picture playback on WebKit/MacOS
- * TODO: update player with state, support, enabled
- * TODO: detect outside changes
- */
-
- }, {
- key: 'pip',
- set: function set$$1(input) {
- var states = {
- pip: 'picture-in-picture',
- inline: 'inline'
- };
-
- // Bail if no support
- if (!support.pip) {
- return;
- }
+ return this.media.getAttribute('poster');
+ }
+ /**
+ * Set the autoplay state
+ * @param {boolean} input - Whether to autoplay or not
+ */
+
+ }, {
+ key: "autoplay",
+ set: function set(input) {
+ var toggle = is.boolean(input) ? input : this.config.autoplay;
+ this.config.autoplay = toggle;
+ }
+ /**
+ * Get the current autoplay state
+ */
+ ,
+ get: function get() {
+ return Boolean(this.config.autoplay);
+ }
+ }, {
+ key: "currentTrack",
+ set: function set(input) {
+ captions.set.call(this, input, false);
+ }
+ /**
+ * Get the current caption track index (-1 if disabled)
+ */
+ ,
+ get: function get() {
+ var _this$captions = this.captions,
+ toggled = _this$captions.toggled,
+ currentTrack = _this$captions.currentTrack;
+ return toggled ? currentTrack : -1;
+ }
+ /**
+ * Set the wanted language for captions
+ * Since tracks can be added later it won't update the actual caption track until there is a matching track
+ * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
+ */
+
+ }, {
+ key: "language",
+ set: function set(input) {
+ captions.setLanguage.call(this, input, false);
+ }
+ /**
+ * Get the current track's language
+ */
+ ,
+ get: function get() {
+ return (captions.getCurrentTrack.call(this) || {}).language;
+ }
+ /**
+ * Toggle picture-in-picture playback on WebKit/MacOS
+ * TODO: update player with state, support, enabled
+ * TODO: detect outside changes
+ */
- // Toggle based on current state if not passed
- var toggle = is.boolean(input) ? input : this.pip === states.inline;
+ }, {
+ key: "pip",
+ set: function set(input) {
+ var states = {
+ pip: 'picture-in-picture',
+ inline: 'inline'
+ }; // Bail if no support
- // Toggle based on current state
- this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);
- }
+ if (!support.pip) {
+ return;
+ } // Toggle based on current state if not passed
- /**
- * Get the current picture-in-picture state
- */
- ,
- get: function get$$1() {
- if (!support.pip) {
- return null;
- }
- return this.media.webkitPresentationMode;
- }
- }], [{
- key: 'supported',
- value: function supported(type, provider, inline) {
- return support.check(type, provider, inline);
- }
+ var toggle = is.boolean(input) ? input : this.pip === states.inline; // Toggle based on current state
- /**
- * Load an SVG sprite into the page
- * @param {string} url - URL for the SVG sprite
- * @param {string} [id] - Unique ID
- */
+ this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);
+ }
+ /**
+ * Get the current picture-in-picture state
+ */
+ ,
+ get: function get() {
+ if (!support.pip) {
+ return null;
+ }
- }, {
- key: 'loadSprite',
- value: function loadSprite$$1(url, id) {
- return loadSprite(url, id);
- }
+ return this.media.webkitPresentationMode;
+ }
+ }], [{
+ key: "supported",
+ value: function supported(type, provider, inline) {
+ return support.check(type, provider, inline);
+ }
+ /**
+ * Load an SVG sprite into the page
+ * @param {string} url - URL for the SVG sprite
+ * @param {string} [id] - Unique ID
+ */
+
+ }, {
+ key: "loadSprite",
+ value: function loadSprite$$1(url, id) {
+ return loadSprite(url, id);
+ }
+ /**
+ * Setup multiple instances
+ * @param {*} selector
+ * @param {object} options
+ */
+
+ }, {
+ key: "setup",
+ value: function setup(selector) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var targets = null;
+
+ if (is.string(selector)) {
+ targets = Array.from(document.querySelectorAll(selector));
+ } else if (is.nodeList(selector)) {
+ targets = Array.from(selector);
+ } else if (is.array(selector)) {
+ targets = selector.filter(is.element);
+ }
- /**
- * Setup multiple instances
- * @param {*} selector
- * @param {object} options
- */
-
- }, {
- key: 'setup',
- value: function setup(selector) {
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
- var targets = null;
-
- if (is.string(selector)) {
- targets = Array.from(document.querySelectorAll(selector));
- } else if (is.nodeList(selector)) {
- targets = Array.from(selector);
- } else if (is.array(selector)) {
- targets = selector.filter(is.element);
- }
+ if (is.empty(targets)) {
+ return null;
+ }
- if (is.empty(targets)) {
- return null;
- }
+ return targets.map(function (t) {
+ return new Plyr(t, options);
+ });
+ }
+ }]);
- return targets.map(function (t) {
- return new Plyr(t, options);
- });
- }
- }]);
- return Plyr;
- }();
+ return Plyr;
+ }();
- Plyr.defaults = cloneDeep(defaults$1);
+ Plyr.defaults = cloneDeep(defaults);
- return Plyr;
+ return Plyr;
})));
diff --git a/dist/plyr.js.map b/dist/plyr.js.map
index 6715f6f1..9f8bb001 100644
--- a/dist/plyr.js.map
+++ b/dist/plyr.js.map
@@ -1 +1 @@
-{"version":3,"sources":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","isArray","Array","isWeakMap","WeakMap","isNodeList","NodeList","isElement","Element","isTextNode","Text","isEvent","Event","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isEmpty","length","keys","isUrl","URL","string","startsWith","hostname","e","nullOrUndefined","object","number","boolean","function","array","weakMap","nodeList","element","textNode","event","keyboardEvent","cue","track","url","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","is","events","split","forEach","eventListeners","push","type","on","call","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","unbindListeners","item","ready","Promise","setTimeout","resolve","elements","container","then","wrap","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","key","setAttribute","createElement","text","document","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","start","charAt","class","id","toggleHidden","hidden","hide","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","trapFocus","focusable","first","last","trap","keyCode","focused","activeElement","shiftKey","focus","preventDefault","setFocus","tabFocus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","test","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","extend","player","set","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","Math","abs","cloneDeep","JSON","parse","stringify","getDeep","path","obj","shift","generateId","prefix","floor","random","format","toString","i","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","Storage","enabled","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","universals","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","createRange","min","step","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","size","restore","propertyName","create","inner","home","backButton","inject","props","seektime","insertMethod","addProperty","controlPressed","labels","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","createObjectURL","blob","browserLanguages","languages","userLanguage","active","trackEvents","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","urls","vimeo","sdk","iframe","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","Fullscreen","property","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","removeCurrent","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","proxy","inputEvent","rect","currentTarget","attribute","hasAttribute","done","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","define","this","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","change","tagName","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(\n event => element.style[event] !== undefined,\n );\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n toggle = true;\n type = 'play';\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, hasClass, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { format, stripHTML } from '../utils/strings';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { format, generateId } from '../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.4.3\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
+{"version":3,"sources":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","isArray","Array","isWeakMap","WeakMap","isNodeList","NodeList","isElement","Element","isTextNode","Text","isEvent","Event","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isEmpty","length","keys","isUrl","URL","string","startsWith","hostname","e","nullOrUndefined","object","number","boolean","function","array","weakMap","nodeList","element","textNode","event","keyboardEvent","cue","track","url","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","is","events","split","forEach","type","eventListeners","push","on","call","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","unbindListeners","item","ready","Promise","resolve","setTimeout","elements","container","then","wrap","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","key","setAttribute","createElement","text","document","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","stripped","parts","start","charAt","class","id","toggleHidden","hidden","hide","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","trapFocus","focusable","first","last","trap","keyCode","focused","activeElement","shiftKey","focus","preventDefault","setFocus","tabFocus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","test","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","extend","player","set","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","Math","abs","cloneDeep","JSON","parse","stringify","getDeep","path","obj","shift","generateId","prefix","floor","random","format","toString","i","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","Storage","enabled","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","universals","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","createRange","min","step","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","size","restore","propertyName","create","inner","home","backButton","inject","props","seektime","insertMethod","addProperty","controlPressed","labels","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","browserLanguages","languages","userLanguage","active","trackEvents","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","urls","vimeo","sdk","iframe","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","removeCurrent","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","proxy","inputEvent","rect","currentTarget","attribute","hasAttribute","done","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","define","this","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","change","tagName","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { format, stripHTML } from '../utils/strings';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { format, generateId } from '../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.4.4\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
diff --git a/dist/plyr.min.js b/dist/plyr.min.js
index 2612dbde..6fb3c5e8 100644
--- a/dist/plyr.min.js
+++ b/dist/plyr.min.js
@@ -1,2 +1,2 @@
-"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";var e=function(e){return null!=e?e.constructor:null},t=function(e,t){return Boolean(e&&t&&e instanceof t)},i=function(e){return null==e},n=function(t){return e(t)===Object},s=function(t){return e(t)===String},a=function(e){return Array.isArray(e)},o=function(e){return t(e,NodeList)},r=function(e){return i(e)||(s(e)||a(e)||o(e))&&!e.length||n(e)&&!Object.keys(e).length},l={nullOrUndefined:i,object:n,number:function(t){return e(t)===Number&&!Number.isNaN(t)},string:s,boolean:function(t){return e(t)===Boolean},function:function(t){return e(t)===Function},array:a,weakMap:function(e){return t(e,WeakMap)},nodeList:o,element:function(e){return t(e,Element)},textNode:function(t){return e(t)===Text},event:function(e){return t(e,Event)},keyboardEvent:function(e){return t(e,KeyboardEvent)},cue:function(e){return t(e,window.TextTrackCue)||t(e,window.VTTCue)},track:function(e){return t(e,TextTrack)||!i(e)&&s(e.kind)},url:function(e){if(t(e,window.URL))return!0;var i=e;e.startsWith("http://")&&e.startsWith("https://")||(i="http://"+e);try{return!r(new URL(i).hostname)}catch(e){return!1}},empty:r},c=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function u(e,t,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=this,a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!l.empty(t)&&l.function(i)){var r=t.split(" "),u=o;c&&(u={passive:a,capture:o}),r.forEach(function(t){s&&s.eventListeners&&n&&s.eventListeners.push({element:e,type:t,callback:i,options:u}),e[n?"addEventListener":"removeEventListener"](t,i,u)})}}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];u.call(this,e,t,i,!0,n,s)}function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];u.call(this,e,t,i,!1,n,s)}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];u.call(this,e,t,function a(){h(e,t,a,n,s);for(var o=arguments.length,r=Array(o),l=0;l<o;l++)r[l]=arguments[l];i.apply(this,r)},!0,n,s)}function f(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(l.element(e)&&!l.empty(t)){var s=new CustomEvent(t,{bubbles:i,detail:Object.assign({},n,{plyr:this})});e.dispatchEvent(s)}}var m=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},g=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),y=function(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e},v=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var i=[],n=!0,s=!1,a=void 0;try{for(var o,r=e[Symbol.iterator]();!(n=(o=r.next()).done)&&(i.push(o.value),!t||i.length!==t);n=!0);}catch(e){s=!0,a=e}finally{try{!n&&r.return&&r.return()}finally{if(s)throw a}}return i}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();function b(e,t){var i=e.length?e:[e];Array.from(i).reverse().forEach(function(e,i){var n=i>0?t.cloneNode(!0):t,s=e.parentNode,a=e.nextSibling;n.appendChild(e),a?s.insertBefore(n,a):s.appendChild(n)})}function k(e,t){l.element(e)&&!l.empty(t)&&Object.entries(t).filter(function(e){var t=v(e,2)[1];return!l.nullOrUndefined(t)}).forEach(function(t){var i=v(t,2),n=i[0],s=i[1];return e.setAttribute(n,s)})}function w(e,t,i){var n=document.createElement(e);return l.object(t)&&k(n,t),l.string(i)&&(n.innerText=i),n}function T(e,t,i,n){l.element(t)&&t.appendChild(w(e,i,n))}function A(e){l.nodeList(e)||l.array(e)?Array.from(e).forEach(A):l.element(e)&&l.element(e.parentNode)&&e.parentNode.removeChild(e)}function E(e){if(l.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function C(e,t){return l.element(t)&&l.element(t.parentNode)&&l.element(e)?(t.parentNode.replaceChild(e,t),e):null}function P(e,t){if(!l.string(e)||l.empty(e))return{};var i={},n=t;return e.split(",").forEach(function(e){var t=e.trim(),s=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),o=a[0],r=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":l.object(n)&&l.string(n.class)&&(n.class+=" "+s),i.class=s;break;case"#":i.id=t.replace("#","");break;case"[":i[o]=r}}),i}function S(e,t){if(l.element(e)){var i=t;l.boolean(i)||(i=!e.hidden),i?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function M(e,t,i){if(l.nodeList(e))return Array.from(e).map(function(e){return M(e,t,i)});if(l.element(e)){var n="toggle";return void 0!==i&&(n=i?"add":"remove"),e.classList[n](t),e.classList.contains(t)}return!1}function N(e,t){return l.element(e)&&e.classList.contains(t)}function L(e,t){var i={Element:Element};return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function x(e){return this.elements.container.querySelectorAll(e)}function _(e){return this.elements.container.querySelector(e)}function I(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];l.element(e)&&(e.focus(),t&&M(e,this.config.classNames.tabFocus))}var O,j,q,R=(O=document.createElement("span"),j={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},q=Object.keys(j).find(function(e){return void 0!==O.style[e]}),!!l.string(q)&&j[q]);function B(e){setTimeout(function(){try{S(e,!0),e.offsetHeight,S(e,!1)}catch(e){}},0)}var H,V={isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)},D={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},F={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,i){var n=V.isIPhone&&i&&F.playsinline,s=F[e]||"html5"!==t;return{api:s,ui:s&&F.rangeInput&&("video"!==e||!V.isIPhone||n)}},pip:!V.isIPhone&&l.function(w("video").webkitSetPresentationMode),airplay:l.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=e.split("/"),i=v(t,1)[0];if(!this.isHTML5||i!==this.type)return!1;var n=void 0;e&&e.includes("codecs=")?n=e:"audio/mpeg"===e?n="audio/mpeg;":e in D&&(n=e+'; codecs="'+D[e]+'"');try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(H=document.createElement("input"),H.type="range","range"===H.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==R,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},U={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return F.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return U.getSources.call(this).map(function(e){return Number(e.getAttribute("size"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=U.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("size"))},set:function(t){var i=U.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(i){var n=e.media,s=n.currentTime,a=n.paused,o=n.preload,r=n.readyState;e.media.src=i.getAttribute("src"),("none"!==o||r)&&(e.once("loadedmetadata",function(){e.currentTime=s,a||e.play()}),e.media.load()),f.call(e,e.media,"qualitychange",!1,{quality:t}),e.storage.set({quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(A(U.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function z(e){return l.array(e)?e.filter(function(t,i){return e.indexOf(t)===i}):e}function W(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function K(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,i=Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];if(!i.length)return e;var s=i.shift();return l.object(s)?(Object.keys(s).forEach(function(t){l.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,y({},t,{})),K(e[t],s[t])):Object.assign(e,y({},t,s[t]))}),K.apply(void 0,[e].concat(i))):e}function Y(e){for(var t=arguments.length,i=Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];return l.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return i[t].toString()})}function J(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1"),"g"),i.toString())}function Q(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function $(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=J(e,"-"," "),e=J(e,"_"," "),J(e=Q(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function G(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var X=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(l.empty(e)||l.empty(t))return"";var i=W(t.i18n,e);if(l.empty(i))return"";var n={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(n).forEach(function(e){var t=v(e,2),n=t[0],s=t[1];i=J(i,n,s)}),i},Z=function(){function e(t){m(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return g(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var i=window.localStorage.getItem(this.key);if(l.empty(i))return null;var n=JSON.parse(i);return l.string(t)&&t.length?n[t]:n}},{key:"set",value:function(t){if(e.supported&&this.enabled&&l.object(t)){var i=this.get();l.empty(i)&&(i={}),K(i,t),window.localStorage.setItem(this.key,JSON.stringify(i))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function ee(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(i,n){try{var s=new XMLHttpRequest;if(!("withCredentials"in s))return;s.addEventListener("load",function(){if("text"===t)try{i(JSON.parse(s.responseText))}catch(e){i(s.responseText)}else i(s.response)}),s.addEventListener("error",function(){throw new Error(s.status)}),s.open("GET",e,!0),s.responseType=t,s.send()}catch(e){n(e)}})}function te(e,t){if(l.string(e)){var i=l.string(t),n=function(){return null!==document.getElementById(t)},s=function(e,t){e.innerHTML=t,i&&n()||document.body.insertAdjacentElement("afterbegin",e)};if(!i||!n()){var a=Z.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),i&&o.setAttribute("id",t),a){var r=window.localStorage.getItem("cache-"+t);if(null!==r){var c=JSON.parse(r);s(o,c.content)}}ee(e).then(function(e){l.empty(e)||(a&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),s(o,e))}).catch(function(){})}}}var ie=function(e){return parseInt(e/60/60%60,10)},ne=function(e){return parseInt(e/60%60,10)},se=function(e){return parseInt(e%60,10)};function ae(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!l.number(e))return ae(null,t,i);var n=function(e){return("0"+e).slice(-2)},s=ie(e),a=ne(e),o=se(e);return t||s>0?s+=":":s="",(i&&e>0?"-":"")+s+n(a)+":"+n(o)}var oe={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||V.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=_.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:x.call(this,this.config.selectors.buttons.play),pause:_.call(this,this.config.selectors.buttons.pause),restart:_.call(this,this.config.selectors.buttons.restart),rewind:_.call(this,this.config.selectors.buttons.rewind),fastForward:_.call(this,this.config.selectors.buttons.fastForward),mute:_.call(this,this.config.selectors.buttons.mute),pip:_.call(this,this.config.selectors.buttons.pip),airplay:_.call(this,this.config.selectors.buttons.airplay),settings:_.call(this,this.config.selectors.buttons.settings),captions:_.call(this,this.config.selectors.buttons.captions),fullscreen:_.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=_.call(this,this.config.selectors.progress),this.elements.inputs={seek:_.call(this,this.config.selectors.inputs.seek),volume:_.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:_.call(this,this.config.selectors.display.buffer),currentTime:_.call(this,this.config.selectors.display.currentTime),duration:_.call(this,this.config.selectors.display.duration)},l.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var i=oe.getIconUrl.call(this),n=(i.cors?"":i.url)+"#"+this.config.iconPrefix,s=document.createElementNS("http://www.w3.org/2000/svg","svg");k(s,K(t,{role:"presentation",focusable:"false"}));var a=document.createElementNS("http://www.w3.org/2000/svg","use"),o=n+"-"+e;return"href"in a?a.setAttributeNS("http://www.w3.org/1999/xlink","href",o):a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),s.appendChild(a),s},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i={pip:"PIP",airplay:"AirPlay"}[e]||X(e,this.config);return w("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),i)},createBadge:function(e){if(l.empty(e))return null;var t=w("span",{class:this.config.classNames.menu.value});return t.appendChild(w("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var i=w("button"),n=Object.assign({},t),s=$(e),a=!1,o=void 0,r=void 0,c=void 0,u=void 0;switch("type"in n||(n.type="button"),"class"in n?n.class.includes(this.config.classNames.control)||(n.class+=" "+this.config.classNames.control):n.class=this.config.classNames.control,e){case"play":a=!0,o="play",c="pause",r="play",u="pause";break;case"mute":a=!0,o="mute",c="unmute",r="volume",u="muted";break;case"captions":a=!0,o="enableCaptions",c="disableCaptions",r="captions-off",u="captions-on";break;case"fullscreen":a=!0,o="enterFullscreen",c="exitFullscreen",r="enter-fullscreen",u="exit-fullscreen";break;case"play-large":n.class+=" "+this.config.classNames.control+"--overlaid",a=!0,s="play",o="play",c="pause",r="play",u="pause";break;default:o=s,r=e}return a?(i.appendChild(oe.createIcon.call(this,u,{class:"icon--pressed"})),i.appendChild(oe.createIcon.call(this,r,{class:"icon--not-pressed"})),i.appendChild(oe.createLabel.call(this,c,{class:"label--pressed"})),i.appendChild(oe.createLabel.call(this,o,{class:"label--not-pressed"}))):(i.appendChild(oe.createIcon.call(this,r)),i.appendChild(oe.createLabel.call(this,o))),K(n,P(this.config.selectors.buttons[s],n)),k(i,n),"play"===s?(l.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(i)):this.elements.buttons[s]=i,i},createRange:function(e,t){var i=w("input",K(P(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":X(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,oe.updateRangeFill.call(this,i),i},createProgress:function(e,t){var i=w("progress",K(P(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){i.appendChild(w("span",null,"0"));var n={played:"played",buffer:"buffered"}[e],s=n?X(n,this.config):"";i.innerText="% "+s.toLowerCase()}return this.elements.display[e]=i,i},createTime:function(e){var t=P(this.config.selectors.display[e]),i=w("div",K(t,{class:(this.config.classNames.display.time+" "+(t.class?t.class:"")).trim(),"aria-label":X(e,this.config)}),"00:00");return this.elements.display[e]=i,i},bindMenuItemShortcuts:function(e,t){var i=this;d(e,"keydown keyup",function(n){if([32,38,39,40].includes(n.which)&&(n.preventDefault(),n.stopPropagation(),"keydown"!==n.type)){var s=L(e,'[role="menuitemradio"]');if(!s&&[32,39].includes(n.which))oe.showMenuPanel.call(i,t,!0);else{var a=void 0;32!==n.which&&(40===n.which||s&&39===n.which?(a=e.nextElementSibling,l.element(a)||(a=e.parentNode.firstElementChild)):(a=e.previousElementSibling,l.element(a)||(a=e.parentNode.lastElementChild)),I.call(i,a,!0))}}},!1),d(e,"keyup",function(e){13===e.which&&oe.focusFirstMenuItem.call(i,null,!0)})},createMenuItem:function(e){var t=this,i=e.value,n=e.list,s=e.type,a=e.title,o=e.badge,r=void 0===o?null:o,c=e.checked,u=void 0!==c&&c,d=P(this.config.selectors.inputs[s]),h=w("button",K(d,{type:"button",role:"menuitemradio",class:(this.config.classNames.control+" "+(d.class?d.class:"")).trim(),"aria-checked":u,value:i})),p=w("span");p.innerHTML=a,l.element(r)&&p.appendChild(r),h.appendChild(p),Object.defineProperty(h,"checked",{enumerable:!0,get:function(){return"true"===h.getAttribute("aria-checked")},set:function(e){e&&Array.from(h.parentNode.children).filter(function(e){return L(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),h.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(h,"click keyup",function(e){if(!l.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),h.checked=!0,s){case"language":t.currentTrack=Number(i);break;case"quality":t.quality=i;break;case"speed":t.speed=parseFloat(i)}oe.showMenuPanel.call(t,"home",l.keyboardEvent(e))}},s,!1),oe.bindMenuItemShortcuts.call(this,h,s),n.appendChild(h)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return l.number(e)?ae(e,ie(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];l.element(e)&&l.number(t)&&(e.innerText=oe.formatTime(t,i))},updateVolume:function(){this.supported.ui&&(l.element(this.elements.inputs.volume)&&oe.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),l.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;l.element(e)&&(e.value=t,oe.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&l.event(e)){var i,n,s=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":i=this.currentTime,n=this.duration,s=0===i||0===n||Number.isNaN(i)||Number.isNaN(n)?0:(i/n*100).toFixed(2),"timeupdate"===e.type&&oe.setRange.call(this,this.elements.inputs.seek,s);break;case"playing":case"progress":!function(e,i){var n=l.number(i)?i:0,s=l.element(e)?e:t.elements.display.buffer;if(l.element(s)){s.value=n;var a=s.getElementsByTagName("span")[0];l.element(a)&&(a.childNodes[0].nodeValue=n)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=l.event(e)?e.target:e;if(l.element(t)&&"range"===t.getAttribute("type")){if(L(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var i=oe.formatTime(this.currentTime),n=oe.formatTime(this.duration),s=X("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",i).replace("{duration}",n))}else if(L(t,this.config.selectors.inputs.volume)){var a=100*t.value;t.setAttribute("aria-valuenow",a),t.setAttribute("aria-valuetext",a.toFixed(1)+"%")}else t.setAttribute("aria-valuenow",t.value);V.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&l.element(this.elements.inputs.seek)&&l.element(this.elements.display.seekTooltip)&&0!==this.duration){var i=0,n=this.elements.progress.getBoundingClientRect(),s=this.config.classNames.tooltip+"--visible",a=function(e){M(t.elements.display.seekTooltip,s,e)};if(this.touch)a(!1);else{if(l.event(e))i=100/n.width*(e.pageX-n.left);else{if(!N(this.elements.display.seekTooltip,s))return;i=parseFloat(this.elements.display.seekTooltip.style.left,10)}i<0?i=0:i>100&&(i=100),oe.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*i),this.elements.display.seekTooltip.style.left=i+"%",l.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&a("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!l.element(this.elements.display.duration)&&this.config.invertTime;oe.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||oe.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return S(this.elements.display.currentTime,!0),void S(this.elements.progress,!0);l.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=l.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&oe.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&oe.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),oe.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){S(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,i){var n=this.elements.settings.panels[e],s=null,a=t;if("captions"===e)s=this.currentTrack;else{if(s=l.empty(i)?this[e]:i,l.empty(s)&&(s=this.config[e].default),!l.empty(this.options[e])&&!this.options[e].includes(s))return void this.debug.warn("Unsupported value of '"+s+"' for "+e);if(!this.config[e].options.includes(s))return void this.debug.warn("Disabled value of '"+s+"' for "+e)}if(l.element(a)||(a=n&&n.querySelector('[role="menu"]')),l.element(a)){this.elements.settings.buttons[e].querySelector("."+this.config.classNames.menu.value).innerHTML=oe.getLabel.call(this,e,s);var o=a&&a.querySelector('[value="'+s+'"]');l.element(o)&&(o.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?X("normal",this.config):t+"&times;";case"quality":if(l.number(t)){var i=X("qualityLabel."+t,this.config);return i.length?i:t+"p"}return Q(t);case"captions":return ce.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(l.element(this.elements.settings.panels.quality)){var i=this.elements.settings.panels.quality.querySelector('[role="menu"]');l.array(e)&&(this.options.quality=z(e).filter(function(e){return t.config.quality.options.includes(e)}));var n=!l.empty(this.options.quality)&&this.options.quality.length>1;if(oe.toggleMenuButton.call(this,"quality",n),E(i),oe.checkMenu.call(this),n){this.options.quality.sort(function(e,i){var n=t.config.quality.options;return n.indexOf(e)>n.indexOf(i)?1:-1}).forEach(function(e){oe.createMenuItem.call(t,{value:e,list:i,type:"quality",title:oe.getLabel.call(t,"quality",e),badge:function(e){var i=X("qualityBadge."+e,t.config);return i.length?oe.createBadge.call(t,i):null}(e)})}),oe.updateSetting.call(this,"quality",i)}}},setCaptionsMenu:function(){var e=this;if(l.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=ce.getTracks.call(this),n=Boolean(i.length);if(oe.toggleMenuButton.call(this,"captions",n),E(t),oe.checkMenu.call(this),n){var s=i.map(function(i,n){return{value:n,checked:e.captions.toggled&&e.currentTrack===n,title:ce.getLabel.call(e,i),badge:i.language&&oe.createBadge.call(e,i.language.toUpperCase()),list:t,type:"language"}});s.unshift({value:-1,checked:!this.captions.toggled,title:X("disabled",this.config),list:t,type:"language"}),s.forEach(oe.createMenuItem.bind(this)),oe.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(l.element(this.elements.settings.panels.speed)){var i=this.elements.settings.panels.speed.querySelector('[role="menu"]');l.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var n=!l.empty(this.options.speed)&&this.options.speed.length>1;oe.toggleMenuButton.call(this,"speed",n),E(i),oe.checkMenu.call(this),n&&(this.options.speed.forEach(function(e){oe.createMenuItem.call(t,{value:e,list:i,type:"speed",title:oe.getLabel.call(t,"speed",e)})}),oe.updateSetting.call(this,"speed",i))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!l.empty(e)&&Object.values(e).some(function(e){return!e.hidden});S(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var i=e;l.element(i)||(i=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var n=i.querySelector('[role^="menuitem"]');I.call(this,n,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,i=this.elements.buttons.settings;if(l.element(t)&&l.element(i)){var n=t.hidden,s=n;if(l.boolean(e))s=e;else if(l.keyboardEvent(e)&&27===e.which)s=!1;else if(l.event(e)){var a=t.contains(e.target);if(a||!a&&e.target!==i&&s)return}i.setAttribute("aria-expanded",s),S(t,!s),M(this.elements.container,this.config.classNames.menu.open,s),s&&l.keyboardEvent(e)?oe.focusFirstMenuItem.call(this,null,!0):s||n||I.call(this,i,l.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var i=t.scrollWidth,n=t.scrollHeight;return A(t),{width:i,height:n}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=document.getElementById("plyr-settings-"+this.id+"-"+t);if(l.element(n)){var s=n.parentNode,a=Array.from(s.children).find(function(e){return!e.hidden});if(F.transitions&&!F.reducedMotion){s.style.width=a.scrollWidth+"px",s.style.height=a.scrollHeight+"px";var o=oe.getMenuSize.call(this,n);d.call(this,s,R,function t(i){i.target===s&&["width","height"].includes(i.propertyName)&&(s.style.width="",s.style.height="",h.call(e,s,R,t))}),s.style.width=o.width+"px",s.style.height=o.height+"px"}S(a,!0),S(n,!1),oe.focusFirstMenuItem.call(this,n,i)}},create:function(e){var t=this,i=w("div",P(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&i.appendChild(oe.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&i.appendChild(oe.createButton.call(this,"rewind")),this.config.controls.includes("play")&&i.appendChild(oe.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&i.appendChild(oe.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var n=w("div",P(this.config.selectors.progress));if(n.appendChild(oe.createRange.call(this,"seek",{id:"plyr-seek-"+e.id})),n.appendChild(oe.createProgress.call(this,"buffer")),this.config.tooltips.seek){var s=w("span",{class:this.config.classNames.tooltip},"00:00");n.appendChild(s),this.elements.display.seekTooltip=s}this.elements.progress=n,i.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&i.appendChild(oe.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&i.appendChild(oe.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var a=w("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&a.appendChild(oe.createButton.call(this,"mute")),this.config.controls.includes("volume")){var o={max:1,step:.05,value:this.config.volume};a.appendChild(oe.createRange.call(this,"volume",K(o,{id:"plyr-volume-"+e.id}))),this.elements.volume=a}i.appendChild(a)}if(this.config.controls.includes("captions")&&i.appendChild(oe.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!l.empty(this.config.settings)){var r=w("div",{class:"plyr__menu",hidden:""});r.appendChild(oe.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var c=w("div",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:""}),u=w("div"),h=w("div",{id:"plyr-settings-"+e.id+"-home"}),p=w("div",{role:"menu"});h.appendChild(p),u.appendChild(h),this.elements.settings.panels.home=h,this.config.settings.forEach(function(i){var n=w("button",K(P(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",role:"menuitem","aria-haspopup":!0,hidden:""}));oe.bindMenuItemShortcuts.call(t,n,i),d(n,"click",function(){oe.showMenuPanel.call(t,i,!1)});var s=w("span",null,X(i,t.config)),a=w("span",{class:t.config.classNames.menu.value});a.innerHTML=e[i],s.appendChild(a),n.appendChild(s),p.appendChild(n);var o=w("div",{id:"plyr-settings-"+e.id+"-"+i,hidden:""}),r=w("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back"});r.appendChild(w("span",{"aria-hidden":!0},X(i,t.config))),r.appendChild(w("span",{class:t.config.classNames.hidden},X("menuBack",t.config))),d(o,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),oe.showMenuPanel.call(t,"home",!0))},!1),d(r,"click",function(){oe.showMenuPanel.call(t,"home",!1)}),o.appendChild(r),o.appendChild(w("div",{role:"menu"})),u.appendChild(o),t.elements.settings.buttons[i]=n,t.elements.settings.panels[i]=o}),c.appendChild(u),r.appendChild(c),i.appendChild(r),this.elements.settings.popup=c,this.elements.settings.menu=r}return this.config.controls.includes("pip")&&F.pip&&i.appendChild(oe.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&F.airplay&&i.appendChild(oe.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&i.appendChild(oe.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(oe.createButton.call(this,"play-large")),this.elements.controls=i,this.isHTML5&&oe.setQualityMenu.call(this,U.getQualityOptions.call(this)),oe.setSpeedMenu.call(this),i},inject:function(){var e=this;if(this.config.loadSprite){var t=oe.getIconUrl.call(this);t.cors&&te(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var i=null;this.elements.controls=null;var n={id:this.id,seektime:this.config.seekTime,title:this.config.title},s=!0;l.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this.props)),this.config.controls||(this.config.controls=[]),l.element(this.config.controls)||l.string(this.config.controls)?i=this.config.controls:(i=oe.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:ce.getLabel.call(this)}),s=!1);var a=function(e){var t=e;return Object.entries(n).forEach(function(e){var i=v(e,2),n=i[0],s=i[1];t=J(t,"{"+n+"}",s)}),t};s&&(l.string(this.config.controls)?i=a(i):l.element(i)&&(i.innerHTML=a(i.innerHTML)));var o=void 0;if(l.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),l.element(o)||(o=this.elements.container),o[l.element(i)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",i),l.element(this.elements.controls)||oe.findElements.call(this),!l.empty(this.elements.buttons)){var r=function(t){var i=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return N(t,i)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];M(t,i,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){l.array(e)||l.nodeList(e)?Array.from(e).filter(Boolean).forEach(r):r(e)})}if(window.navigator.userAgent.includes("Edge")&&B(o),this.config.tooltips.controls){var c=this.config,u=c.classNames,d=c.selectors,h=d.controls.wrapper+" "+d.labels+" ."+u.hidden,p=x.call(this,h);Array.from(p).forEach(function(t){M(t,e.config.classNames.hidden,!1),M(t,e.config.classNames.tooltip,!0)})}}};function re(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var i=document.createElement("a");i.href=t,t=i.href}try{return new URL(t)}catch(e){return null}}function le(e){var t=new URLSearchParams;return l.object(e)&&Object.entries(e).forEach(function(e){var i=v(e,2),n=i[0],s=i[1];t.set(n,s)}),t}var ce={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!F.textTracks)l.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&oe.setCaptionsMenu.call(this);else{var e,t;if(l.element(this.elements.captions)||(this.elements.captions=w("div",P(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,l.element(e)&&l.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),V.isIE&&window.URL){var i=this.media.querySelectorAll("track");Array.from(i).forEach(function(e){var t=e.getAttribute("src"),i=re(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&ee(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){A(e)})})}var n=z((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),s=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===s)s=v(n,1)[0];var a=this.storage.get("captions");if(l.boolean(a)||(a=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:a,language:s,languages:n}),this.isHTML5){var o=this.config.captions.update?"addtrack removetrack":"removetrack";d.call(this,this.media.textTracks,o,ce.update.bind(this))}setTimeout(ce.update.bind(this),0)}},update:function(){var e=this,t=ce.getTracks.call(this,!0),i=this.captions,n=i.active,s=i.language,a=i.meta,o=i.currentTrackNode,r=Boolean(t.find(function(e){return e.language===s}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!a.get(e)}).forEach(function(t){e.debug.log("Track added",t),a.set(t,{default:"showing"===t.mode}),t.mode="hidden",d.call(e,t,"cuechange",function(){return ce.updateCues.call(e)})}),(r&&this.language!==s||!t.includes(o))&&(ce.setLanguage.call(this,s),ce.toggle.call(this,n&&r)),M(this.elements.container,this.config.classNames.captions.enabled,!l.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&oe.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var i=this.captions.toggled,n=this.config.classNames.captions.active,s=l.nullOrUndefined(e)?!i:e;if(s!==i){if(t||(this.captions.active=s,this.storage.set({captions:s})),!this.language&&s&&!t){var a=ce.getTracks.call(this),o=ce.findTrack.call(this,[this.captions.language].concat(function(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t<e.length;t++)i[t]=e[t];return i}return Array.from(e)}(this.captions.languages)),!0);return this.captions.language=o.language,void ce.set.call(this,a.indexOf(o))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=s),M(this.elements.container,n,s),this.captions.toggled=s,oe.updateSetting.call(this,"captions"),f.call(this,this.media,s?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=ce.getTracks.call(this);if(-1!==e)if(l.number(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var n=i[e],s=(n||{}).language;this.captions.currentTrackNode=n,oe.updateSetting.call(this,"captions"),t||(this.captions.language=s,this.storage.set({language:s})),this.isVimeo&&this.embed.enableTextTrack(s),f.call(this,this.media,"languagechange")}ce.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&ce.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else ce.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(l.string(e)){var i=e.toLowerCase();this.captions.language=i;var n=ce.getTracks.call(this),s=ce.findTrack.call(this,[i]);ce.set.call(this,n.indexOf(s),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(i){return!e.isHTML5||t||e.captions.meta.has(i)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=ce.getTracks.call(this),s=function(e){return Number((t.captions.meta.get(e)||{}).default)},a=Array.from(n).sort(function(e,t){return s(t)-s(e)}),o=void 0;return e.every(function(e){return!(o=a.find(function(t){return t.language===e}))}),o||(i?a[0]:void 0)},getCurrentTrack:function(){return ce.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!l.track(t)&&F.textTracks&&this.captions.toggled&&(t=ce.getCurrentTrack.call(this)),l.track(t)?l.empty(t.label)?l.empty(t.language)?X("enabled",this.config):e.language.toUpperCase():t.label:X("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(l.element(this.elements.captions))if(l.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var i=ce.getCurrentTrack.call(this);t=Array.from((i||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(G)}var n=t.map(function(e){return e.trim()}).join("\n");if(n!==this.elements.captions.innerHTML){E(this.elements.captions);var s=w("span",P(this.config.selectors.caption));s.innerHTML=n,this.elements.captions.appendChild(s),f.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},ue={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},de={html5:"html5",youtube:"youtube",vimeo:"vimeo"},he={audio:"audio",video:"video"};var pe=function(){},fe=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];m(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return g(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):pe}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):pe}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):pe}}]),e}();function me(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;l.element(e)&&(e.pressed=this.active),f.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),V.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(l.element(e)){var i=x.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),n=i[0],s=i[i.length-1];u.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==s||e.shiftKey?t===n&&e.shiftKey&&(s.focus(),e.preventDefault()):(n.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function ge(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",M(this.target,this.player.config.classNames.fullscreen.fallback,e),me.call(this)}var ye=function(){function e(t){var i=this;m(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},d.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){me.call(i)}),d.call(this.player,this.player.elements.container,"dblclick",function(e){l.element(i.player.elements.controls)&&i.player.elements.controls.contains(e.target)||i.toggle()}),this.update()}return g(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),M(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(V.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():e.native?this.prefix?l.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():ge.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(V.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!l.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else ge.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:N(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return V.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(l.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!l.function(document[t+"ExitFullscreen"])&&!l.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function ve(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(i,n){var s=new Image,a=function(){delete s.onload,delete s.onerror,(s.naturalWidth>=t?i:n)(s)};Object.assign(s,{onload:a,onerror:a,src:e})})}var be={addStyleHook:function(){M(this.elements.container,this.config.selectors.container.replace(".",""),!0),M(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void be.toggleNativeControls.call(this,!0);l.element(this.elements.controls)||(oe.inject.call(this),this.listeners.controls()),be.toggleNativeControls.call(this),this.isHTML5&&ce.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,oe.updateVolume.call(this),oe.timeUpdate.call(this),be.checkPlaying.call(this),M(this.elements.container,this.config.classNames.pip.supported,F.pip&&this.isHTML5&&this.isVideo),M(this.elements.container,this.config.classNames.airplay.supported,F.airplay&&this.isHTML5),M(this.elements.container,this.config.classNames.isIos,V.isIos),M(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){f.call(e,e.media,"ready")},0),be.setTitle.call(this),this.poster&&be.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&oe.durationUpdate.call(this)},setTitle:function(){var e=X("play",this.config);if(l.string(this.config.title)&&!l.empty(this.config.title)&&(e+=", "+this.config.title),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=_.call(this,"iframe");if(!l.element(t))return;var i=l.empty(this.config.title)?"video":this.config.title,n=X("frameTitle",this.config);t.setAttribute("title",n.replace("{title}",i))}},togglePoster:function(e){M(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):d.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return ve(e)}).catch(function(i){throw e===t.poster&&be.togglePoster.call(t,!1),i}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),be.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;M(this.elements.container,this.config.classNames.playing,this.playing),M(this.elements.container,this.config.classNames.paused,this.paused),M(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),l.event(e)&&"timeupdate"===e.type||be.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){M(t.elements.container,t.config.classNames.loading,t.loading),be.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},ke=function(){function e(t){m(this,e),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return g(e,[{key:"handleKey",value:function(e){var t=this.player,i=t.elements,n=e.keyCode?e.keyCode:e.which,s="keydown"===e.type,a=s&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&l.number(n)){if(s){var o=document.activeElement;if(l.element(o)){var r=t.config.selectors.editable;if(o!==i.inputs.seek&&L(o,r))return;if(32===e.which&&L(o,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(n)&&(e.preventDefault(),e.stopPropagation()),n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:a||(t.currentTime=t.duration/10*(n-48));break;case 32:case 75:a||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:a||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:a||t.toggleCaptions();break;case 76:t.loop=!t.loop}!t.fullscreen.enabled&&t.fullscreen.active&&27===n&&t.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){oe.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,M(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,i=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var n,s=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||s)n=t.config.classNames.tabFocus,M(x.call(t,"."+n),n,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;i.container.contains(e)&&M(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&u.call(t,window,"keydown keyup",this.handleKey,e,!1),u.call(t,document.body,"click",this.toggleMenu,e),p.call(t,document.body,"touchstart",this.firstTouch),u.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.elements;!e.config.keyboard.global&&e.config.keyboard.focused&&d.call(e,t.container,"keydown keyup",this.handleKey,!1),d.call(e,t.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(i){var n=t.controls;n&&"enterfullscreen"===i.type&&(n.pressed=!1,n.hover=!1);var s=0;["touchstart","touchmove","mousemove"].includes(i.type)&&(be.toggleControls.call(e,!0),s=e.touch?3e3:2e3),clearTimeout(e.timers.controls),e.timers.controls=setTimeout(function(){return be.toggleControls.call(e,!1)},s)})}},{key:"media",value:function(){var e=this.player,t=e.elements;if(d.call(e,e.media,"timeupdate seeking seeked",function(t){return oe.timeUpdate.call(e,t)}),d.call(e,e.media,"durationchange loadeddata loadedmetadata",function(t){return oe.durationUpdate.call(e,t)}),d.call(e,e.media,"canplay",function(){S(t.volume,!e.hasAudio),S(t.buttons.mute,!e.hasAudio)}),d.call(e,e.media,"ended",function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&e.restart()}),d.call(e,e.media,"progress playing seeking seeked",function(t){return oe.updateProgress.call(e,t)}),d.call(e,e.media,"volumechange",function(t){return oe.updateVolume.call(e,t)}),d.call(e,e.media,"playing play pause ended emptied timeupdate",function(t){return be.checkPlaying.call(e,t)}),d.call(e,e.media,"waiting canplay seeked playing",function(t){return be.checkLoading.call(e,t)}),d.call(e,e.media,"playing",function(){e.ads&&e.ads.enabled&&!e.ads.initialized&&e.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.play()})}),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var i=_.call(e,"."+e.config.classNames.video);if(!l.element(i))return;d.call(e,t.container,"click",function(n){([t.container,i].includes(n.target)||i.contains(n.target))&&(e.touch&&e.config.hideControls||(e.ended?(e.restart(),e.play()):e.togglePlay()))})}e.supported.ui&&e.config.disableContextMenu&&d.call(e,t.wrapper,"contextmenu",function(e){e.preventDefault()},!1),d.call(e,e.media,"volumechange",function(){e.storage.set({volume:e.volume,muted:e.muted})}),d.call(e,e.media,"ratechange",function(){oe.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),d.call(e,e.media,"qualitychange",function(t){oe.updateSetting.call(e,"quality",null,t.detail.quality)});var n=e.config.events.concat(["keyup","keydown"]).join(" ");d.call(e,e.media,n,function(i){var n=i.detail,s=void 0===n?{}:n;"error"===i.type&&(s=e.media.error),f.call(e,t.container,i.type,!0,s)})}},{key:"proxy",value:function(e,t,i){var n=this.player,s=n.config.listeners[i],a=!0;l.function(s)&&(a=s.call(n,e)),a&&l.function(t)&&t.call(n,e)}},{key:"bind",value:function(e,t,i,n){var s=this,a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=this.player,r=o.config.listeners[n],c=l.function(r);d.call(o,e,t,function(e){return s.proxy(e,i,n)},a&&!c)}},{key:"controls",value:function(){var e=this,t=this.player,i=t.elements,n=V.isIE?"change":"input";if(i.buttons.play&&Array.from(i.buttons.play).forEach(function(i){e.bind(i,"click",t.togglePlay,"play")}),this.bind(i.buttons.restart,"click",t.restart,"restart"),this.bind(i.buttons.rewind,"click",t.rewind,"rewind"),this.bind(i.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(i.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(i.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(i.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(i.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(i.buttons.airplay,"click",t.airplay,"airplay"),this.bind(i.buttons.settings,"click",function(e){e.stopPropagation(),oe.toggleMenu.call(t,e)}),this.bind(i.buttons.settings,"keyup",function(e){var i=e.which;[13,32].includes(i)&&(13!==i?(e.preventDefault(),e.stopPropagation(),oe.toggleMenu.call(t,e)):oe.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(i.settings.menu,"keydown",function(e){27===e.which&&oe.toggleMenu.call(t,e)}),this.bind(i.inputs.seek,"mousedown mousemove",function(e){var t=i.progress.getBoundingClientRect(),n=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",n)}),this.bind(i.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var i=e.currentTarget,n=e.keyCode?e.keyCode:e.which;if(!l.keyboardEvent(e)||39===n||37===n){var s=i.hasAttribute("play-on-seeked"),a=["mouseup","touchend","keyup"].includes(e.type);s&&a?(i.removeAttribute("play-on-seeked"),t.play()):!a&&t.playing&&(i.setAttribute("play-on-seeked",""),t.pause())}}),V.isIos){var s=x.call(t,'input[type="range"]');Array.from(s).forEach(function(t){return e.bind(t,n,function(e){return B(e.target)})})}this.bind(i.inputs.seek,n,function(e){var i=e.currentTarget,n=i.getAttribute("seek-value");l.empty(n)&&(n=i.value),i.removeAttribute("seek-value"),t.currentTime=n/i.max*t.duration},"seek"),this.bind(i.progress,"mouseenter mouseleave mousemove",function(e){return oe.updateSeekTooltip.call(t,e)}),V.isWebkit&&Array.from(x.call(t,'input[type="range"]')).forEach(function(i){e.bind(i,"input",function(e){return oe.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!l.element(i.display.duration)&&this.bind(i.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,oe.timeUpdate.call(t))}),this.bind(i.inputs.volume,n,function(e){t.volume=e.target.value},"volume"),this.bind(i.controls,"mouseenter mouseleave",function(e){i.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(i.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){i.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(i.controls,"focusin focusout",function(i){var n=t.config,s=t.elements,a=t.timers,o="focusin"===i.type;if(M(s.controls,n.classNames.noTransition,o),be.toggleControls.call(t,o),o){setTimeout(function(){M(s.controls,n.classNames.noTransition,!1)},0);var r=e.touch?3e3:4e3;clearTimeout(a.controls),a.controls=setTimeout(function(){return be.toggleControls.call(t,!1)},r)}}),this.bind(i.inputs.volume,"wheel",function(e){var i=e.webkitDirectionInvertedFromDevice,n=[e.deltaX,-e.deltaY].map(function(e){return i?-e:e}),s=v(n,2),a=s[0],o=s[1],r=Math.sign(Math.abs(a)>Math.abs(o)?a:o);t.increaseVolume(r/50);var l=t.media.volume;(1===r&&l<1||-1===r&&l>0)&&e.preventDefault()},"volume",!1)}}]),e}();"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var we,Te=(function(e,t){var i;i=function(){var e=function(){},t={},i={},n={};function s(e,t){if(e){var s=n[e];if(i[e]=t,s)for(;s.length;)s[0](e,t),s.splice(0,1)}}function a(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function o(t,i,n,s){var a,r,l=document,c=n.async,u=(n.numRetries||0)+1,d=n.before||e,h=t.replace(/^(css|img)!/,"");s=s||0,/(^css!|\.css$)/.test(t)?(a=!0,(r=l.createElement("link")).rel="stylesheet",r.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(r=l.createElement("img")).src=h:((r=l.createElement("script")).src=t,r.async=void 0===c||c),r.onload=r.onerror=r.onbeforeload=function(e){var l=e.type[0];if(a&&"hideFocus"in r)try{r.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(s+=1)<u)return o(t,i,n,s);i(t,l,e.defaultPrevented)},!1!==d(t,r)&&l.head.appendChild(r)}function r(e,i,n){var r,l;if(i&&i.trim&&(r=i),l=(r?n:i)||{},r){if(r in t)throw"LoadJS";t[r]=!0}!function(e,t,i){var n,s,a=(e=e.push?e:[e]).length,r=a,l=[];for(n=function(e,i,n){if("e"==i&&l.push(e),"b"==i){if(!n)return;l.push(e)}--a||t(l)},s=0;s<r;s++)o(e[s],n,i)}(e,function(e){a(l,e),s(r,e)},l)}return r.ready=function(e,t){return function(e,t){e=e.push?e:[e];var s,a,o,r=[],l=e.length,c=l;for(s=function(e,i){i.length&&r.push(e),--c||t(r)};l--;)a=e[l],(o=i[a])?s(a,o):(n[a]=n[a]||[]).push(s)}(e,function(e){a(t,e)}),r},r.done=function(e){s(e,[])},r.reset=function(){t={},i={},n={}},r.isDefined=function(e){return e in t},r},e.exports=i()}(we={exports:{}},we.exports),we.exports);function Ae(e){return new Promise(function(t,i){Te(e,{success:t,error:i})})}function Ee(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,f.call(this,this.media,e?"play":"pause"))}var Ce={setup:function(){var e=this;M(this.elements.wrapper,this.config.classNames.embed,!0),Ce.setAspectRatio.call(this),l.object(window.Vimeo)?Ce.ready.call(this):Ae(this.config.urls.vimeo.sdk).then(function(){Ce.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=(l.string(e)?e:this.config.ratio).split(":"),i=v(t,2),n=100/i[0]*i[1];if(this.elements.wrapper.style.paddingBottom=n+"%",this.supported.ui){var s=(240-n)/4.8;this.media.style.transform="translateY(-"+s+"%)"}},ready:function(){var e=this,t=this,i=le({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),n=t.media.getAttribute("src");l.empty(n)&&(n=t.media.getAttribute(t.config.attributes.embed.id));var s,a=(s=n,l.empty(s)?null:l.number(Number(s))?s:s.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:s),o=w("iframe"),r=Y(t.config.urls.vimeo.iframe,a,i);o.setAttribute("src",r),o.setAttribute("allowfullscreen",""),o.setAttribute("allowtransparency",""),o.setAttribute("allow","autoplay");var c=w("div",{poster:t.poster,class:t.config.classNames.embedContainer});c.appendChild(o),t.media=C(c,t.media),ee(Y(t.config.urls.vimeo.api,a),"json").then(function(e){if(!l.empty(e)){var i=new URL(e[0].thumbnail_large);i.pathname=i.pathname.split("_")[0]+".jpg",be.setPoster.call(t,i.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(o,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return Ee.call(t,!0),t.embed.play()},t.media.pause=function(){return Ee.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var u=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return u},set:function(e){var i=t.embed,n=t.media,s=t.paused,a=t.volume,o=s&&!i.hasPlayed;n.seeking=!0,f.call(t,n,"seeking"),Promise.resolve(o&&i.setVolume(0)).then(function(){return i.setCurrentTime(e)}).then(function(){return o&&i.pause()}).then(function(){return o&&i.setVolume(a)}).catch(function(){})}});var d=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return d},set:function(e){t.embed.setPlaybackRate(e).then(function(){d=e,f.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&oe.setSpeedMenu.call(t,[])})}});var h=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return h},set:function(e){t.embed.setVolume(e).then(function(){h=e,f.call(t,t.media,"volumechange")})}});var p=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return p},set:function(e){var i=!!l.boolean(e)&&e;t.embed.setVolume(i?0:t.config.volume).then(function(){p=i,f.call(t,t.media,"volumechange")})}});var m=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return m},set:function(e){var i=l.boolean(e)?e:t.config.loop.active;t.embed.setLoop(i).then(function(){m=i})}});var g=void 0;t.embed.getVideoUrl().then(function(e){g=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return g}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var i=function(e,t){var i=function e(t,i){return 0===i?t:e(i,t%i)}(e,t);return e/i+":"+t/i}(t[0],t[1]);Ce.setAspectRatio.call(e,i)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(i){t.config.title=i,be.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){u=e,f.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,f.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,ce.setup.call(t)}),t.embed.on("cuechange",function(e){var i=e.cues,n=(void 0===i?[]:i).map(function(e){return t=e.text,i=document.createDocumentFragment(),n=document.createElement("div"),i.appendChild(n),n.innerHTML=t,i.firstChild.innerText;var t,i,n});ce.updateCues.call(t,n)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){Ee.call(t,!e),e||f.call(t,t.media,"playing")}),l.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){Ee.call(t,!0),f.call(t,t.media,"playing")}),t.embed.on("pause",function(){Ee.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,u=e.seconds,f.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,f.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&f.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,f.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,f.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,f.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,f.call(t,t.media,"error")}),setTimeout(function(){return be.build.call(t)},0)}};function Pe(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,f.call(this,this.media,e?"play":"pause"))}var Se,Me={setup:function(){var e=this;M(this.elements.wrapper,this.config.classNames.embed,!0),Me.setAspectRatio.call(this),l.object(window.YT)&&l.function(window.YT.Player)?Me.ready.call(this):(Ae(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){Me.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(l.function(this.embed.getVideoData)){var i=this.embed.getVideoData().title;if(l.empty(i))return this.config.title=i,void be.setTitle.call(this)}var n=this.config.keys.google;l.string(n)&&!l.empty(n)&&ee(Y(this.config.urls.youtube.api,e,n)).then(function(e){l.object(e)&&(t.config.title=e.items[0].snippet.title,be.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(l.empty(t)||!t.startsWith("youtube-")){var i=e.media.getAttribute("src");l.empty(i)&&(i=e.media.getAttribute(this.config.attributes.embed.id));var n,s=(n=i,l.empty(n)?null:n.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:n),a=e.provider+"-"+Math.floor(1e4*Math.random()),o=w("div",{id:a,poster:e.poster});e.media=C(o,e.media);var r=function(e){return"https://img.youtube.com/vi/"+s+"/"+e+"default.jpg"};ve(r("maxres"),121).catch(function(){return ve(r("sd"),121)}).catch(function(){return ve(r("hq"))}).then(function(t){return be.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(a,{videoId:s,playerVars:{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!e.media.error){var i=t.data,n={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[i]||"An unknown error occured";e.media.error={code:i,message:n},f.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var i=t.target;e.media.playbackRate=i.getPlaybackRate(),f.call(e,e.media,"ratechange")},onReady:function(t){if(!l.function(e.media.play)){var i=t.target;Me.getTitle.call(e,s),e.media.play=function(){Pe.call(e,!0),i.playVideo()},e.media.pause=function(){Pe.call(e,!1),i.pauseVideo()},e.media.stop=function(){i.stopVideo()},e.media.duration=i.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(i.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,f.call(e,e.media,"seeking"),i.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return i.getPlaybackRate()},set:function(e){i.setPlaybackRate(e)}});var n=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return n},set:function(t){n=t,i.setVolume(100*n),f.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var n=l.boolean(t)?t:a;a=n,i[n?"mute":"unMute"](),f.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return i.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=i.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),f.call(e,e.media,"timeupdate"),f.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=i.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&f.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),f.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return be.build.call(e)},50)}},onStateChange:function(t){var i=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,f.call(e,e.media,"seeked")),t.data){case-1:f.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),f.call(e,e.media,"progress");break;case 0:Pe.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):f.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Pe.call(e,!0),f.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){f.call(e,e.media,"timeupdate")},50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),f.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Pe.call(e,!1)}f.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},Ne={setup:function(){this.media?(M(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),M(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&M(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=w("div",{class:this.config.classNames.video}),b(this.media,this.elements.wrapper),this.elements.poster=w("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?U.extend.call(this):this.isYouTube?Me.setup.call(this):this.isVimeo&&Ce.setup.call(this)):this.debug.warn("No media element found!")}},Le=function(){function e(t){var i=this;m(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){i.on("loaded",e),i.on("error",t)}),this.load()}return g(e,[{key:"load",value:function(){var e=this;this.enabled&&(l.object(window.google)&&l.object(window.google.ima)?this.ready():Ae(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=w("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var i=new google.ima.AdsRequest;i.adTagUrl=this.tagUrl,i.linearAdSlotWidth=t.offsetWidth,i.linearAdSlotHeight=t.offsetHeight,i.nonLinearAdSlotWidth=t.offsetWidth,i.nonLinearAdSlotHeight=t.offsetHeight,i.forceNonLinearFullSlot=!1,i.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(i)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=ae(Math.max(e.manager.getRemainingTime(),0)),i=X("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",i)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var i=new google.ima.AdsRenderingSettings;i.restoreCustomPlaybackStateOnAdBreakComplete=!0,i.enablePreloading=!0,this.manager=e.getAdsManager(this.player,i),this.cuePoints=this.manager.getCuePoints(),l.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var i=t.player.elements.progress;if(l.element(i)){var n=100/t.player.duration*e,s=w("span",{class:t.player.config.classNames.cues});s.style.left=n.toString()+"%",i.appendChild(s)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}}},{key:"onAdEvent",value:function(e){var t=this,i=this.player.elements.container,n=e.getAd(),s=function(e){var i="ads"+e.replace(/_/g,"").toLowerCase();f.call(t.player,t.player.media,i)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),s(e.type),this.pollCountdown(!0),n.isLinear()||(n.width=i.offsetWidth,n.height=i.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:s(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:s(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:s(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:s(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,i=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return i=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;l.empty(e.cuePoints)||e.cuePoints.forEach(function(n,s){i<n&&n<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(s,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,i=arguments.length,n=Array(i>1?i-1:0),s=1;s<i;s++)n[s-1]=arguments[s];var a=this.events[e];l.array(a)&&a.forEach(function(e){l.function(e)&&e.apply(t,n)})}},{key:"on",value:function(e,t){return l.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var i=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){i.cancel(),i.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){l.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.ads.enabled&&!l.empty(this.publisherId)}},{key:"tagUrl",get:function(){return"https://go.aniview.com/api/adserver6/vast/?"+le({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId})}}]),e}(),xe={insertElements:function(e,t){var i=this;l.string(t)?T(e,this.media,{src:t}):l.array(t)&&t.forEach(function(t){T(e,i.media,t)})},change:function(e){var t=this;W(e,"sources.length")?(U.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],A(t.media),t.media=null,l.element(t.elements.container)&&t.elements.container.removeAttribute("class");var i=e.sources,n=e.type,s=v(i,1)[0],a=s.provider,o=void 0===a?de.html5:a,r=s.src,c="html5"===o?n:"div",u="html5"===o?{}:{src:r};Object.assign(t,{provider:o,type:n,supported:F.check(n,o,t.config.playsinline),media:w(c,u)}),t.elements.container.appendChild(t.media),l.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),l.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),be.addStyleHook.call(t),t.isHTML5&&xe.insertElements.call(t,"source",i),t.config.title=e.title,Ne.setup.call(t),t.isHTML5&&("tracks"in e&&xe.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&be.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},_e=function(){function e(t,i){var n=this;if(m(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=F.touch,this.media=t,l.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||l.nodeList(this.media)||l.array(this.media))&&(this.media=this.media[0]),this.config=K({},ue,e.defaults,i||{},function(){try{return JSON.parse(n.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new fe(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",F),!l.nullOrUndefined(this.media)&&l.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(F.check().api){var s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;var a=this.media.tagName.toLowerCase(),o=null,r=null;switch(a){case"div":if(o=this.media.querySelector("iframe"),l.element(o)){if(r=re(o.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?de.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?de.vimeo:null}(r.toString()),this.elements.container=this.media,this.media=o,this.elements.container.className="",r.search.length){var c=["1","true"];c.includes(r.searchParams.get("autoplay"))&&(this.config.autoplay=!0),c.includes(r.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=c.includes(r.searchParams.get("playsinline")),this.config.hl=r.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(l.empty(this.provider)||!Object.keys(de).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=he.video;break;case"video":case"audio":this.type=a,this.provider=de.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=F.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new ke(this),this.storage=new Z(this),this.media.plyr=this,l.element(this.elements.container)||(this.elements.container=w("div"),b(this.media,this.elements.container)),be.addStyleHook.call(this),Ne.setup.call(this),this.config.debug&&d.call(this,this.elements.container,this.config.events.join(" "),function(e){n.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&be.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new ye(this),this.config.ads.enabled&&(this.ads=new Le(this)),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return g(e,[{key:"play",value:function(){return l.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&l.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(l.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):l.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(l.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(l.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(l.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){ce.toggle.call(this,e,!1)}},{key:"airplay",value:function(){F.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=N(this.elements.container,this.config.classNames.hideControls),i=void 0===e?void 0:!e,n=M(this.elements.container,this.config.classNames.hideControls,i);if(n&&this.config.controls.includes("settings")&&!l.empty(this.config.settings)&&oe.toggleMenu.call(this,!1),n!==t){var s=n?"controlshidden":"controlsshown";f.call(this,this.media,s)}return!n}return!1}},{key:"on",value:function(e,t){d.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){p.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){h(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var n=function(){document.body.style.overflow="",t.embed=null,i?(Object.keys(t.elements).length&&(A(t.elements.buttons.play),A(t.elements.captions),A(t.elements.controls),A(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),l.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,i=e.type,n=e.callback,s=e.options;t.removeEventListener(i,n,s)}),this.eventListeners=[])}.call(t),C(t.elements.original,t.elements.container),f.call(t,t.elements.original,"destroyed",!0),l.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),be.toggleNativeControls.call(this,!0),n()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&l.function(this.embed.destroy)&&this.embed.destroy(),n()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(n),setTimeout(n,200))}}},{key:"supports",value:function(e){return F.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===de.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===de.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===de.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===he.video)}},{key:"isAudio",get:function(){return Boolean(this.type===he.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=l.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return l.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration,i=l.number(t)&&t!==1/0?t:0;return e||i}},{key:"volume",set:function(e){var t=e;l.string(t)&&(t=Number(t)),l.number(t)||(t=this.storage.get("volume")),l.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!l.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;l.boolean(t)||(t=this.storage.get("muted")),l.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;l.number(e)&&(t=e),l.number(t)||(t=this.storage.get("speed")),l.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,i=this.options.quality;if(i.length){var n=[!l.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(l.number);if(!i.includes(n)){var s=function(e,t){return l.array(e)&&e.length?e.reduce(function(e,i){return Math.abs(i-t)<Math.abs(e-t)?i:e}):null}(i,n);this.debug.warn("Unsupported quality option: "+n+", using "+s+" instead"),n=s}t.selected=n,this.media.quality=n}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=l.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){xe.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?be.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=l.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){ce.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,i=e.currentTrack;return t?i:-1}},{key:"language",set:function(e){ce.setLanguage.call(this,e,!1)},get:function(){return(ce.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",i="inline";if(F.pip){var n=l.boolean(e)?e:this.pip===i;this.media.webkitSetPresentationMode(n?t:i)}},get:function(){return F.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,i){return F.check(e,t,i)}},{key:"loadSprite",value:function(e,t){return te(e,t)}},{key:"setup",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null;return l.string(t)?n=Array.from(document.querySelectorAll(t)):l.nodeList(t)?n=Array.from(t):l.array(t)&&(n=t.filter(l.element)),l.empty(n)?null:n.map(function(t){return new e(t,i)})}}]),e}();return _e.defaults=(Se=ue,JSON.parse(JSON.stringify(Se))),_e});
+"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function n(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,a=!1,s=void 0;try{for(var o,r=e[Symbol.iterator]();!(i=(o=r.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){a=!0,s=e}finally{try{i||null==r.return||r.return()}finally{if(a)throw s}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}var o=function(e){return null!=e?e.constructor:null},r=function(e,t){return Boolean(e&&t&&e instanceof t)},l=function(e){return null==e},c=function(e){return o(e)===Object},u=function(e){return o(e)===String},d=function(e){return Array.isArray(e)},h=function(e){return r(e,NodeList)},p=function(e){return l(e)||(u(e)||d(e)||h(e))&&!e.length||c(e)&&!Object.keys(e).length},f={nullOrUndefined:l,object:c,number:function(e){return o(e)===Number&&!Number.isNaN(e)},string:u,boolean:function(e){return o(e)===Boolean},function:function(e){return o(e)===Function},array:d,weakMap:function(e){return r(e,WeakMap)},nodeList:h,element:function(e){return r(e,Element)},textNode:function(e){return o(e)===Text},event:function(e){return r(e,Event)},keyboardEvent:function(e){return r(e,KeyboardEvent)},cue:function(e){return r(e,window.TextTrackCue)||r(e,window.VTTCue)},track:function(e){return r(e,TextTrack)||!l(e)&&u(e.kind)},url:function(e){if(r(e,window.URL))return!0;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!p(new URL(t).hostname)}catch(e){return!1}},empty:p},m=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function g(e,t,n){var i=this,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!f.empty(t)&&f.function(n)){var r=t.split(" "),l=o;m&&(l={passive:s,capture:o}),r.forEach(function(t){i&&i.eventListeners&&a&&i.eventListeners.push({element:e,type:t,callback:n,options:l}),e[a?"addEventListener":"removeEventListener"](t,n,l)})}}function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];g.call(this,e,t,n,!0,i,a)}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];g.call(this,e,t,n,!1,i,a)}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];g.call(this,e,t,function s(){v(e,t,s,i,a);for(var o=arguments.length,r=new Array(o),l=0;l<o;l++)r[l]=arguments[l];n.apply(this,r)},!0,i,a)}function k(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(f.element(e)&&!f.empty(t)){var a=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(a)}}function w(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,a=e.parentNode,s=e.nextSibling;i.appendChild(e),s?a.insertBefore(i,s):a.appendChild(i)})}function T(e,t){f.element(e)&&!f.empty(t)&&Object.entries(t).filter(function(e){var t=a(e,2)[1];return!f.nullOrUndefined(t)}).forEach(function(t){var n=a(t,2),i=n[0],s=n[1];return e.setAttribute(i,s)})}function A(e,t,n){var i=document.createElement(e);return f.object(t)&&T(i,t),f.string(n)&&(i.innerText=n),i}function E(e,t,n,i){f.element(t)&&t.appendChild(A(e,n,i))}function C(e){f.nodeList(e)||f.array(e)?Array.from(e).forEach(C):f.element(e)&&f.element(e.parentNode)&&e.parentNode.removeChild(e)}function P(e){if(f.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function S(e,t){return f.element(t)&&f.element(t.parentNode)&&f.element(e)?(t.parentNode.replaceChild(e,t),e):null}function M(e,t){if(!f.string(e)||f.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),a=t.replace(".",""),s=t.replace(/[[\]]/g,"").split("="),o=s[0],r=s.length>1?s[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":f.object(i)&&f.string(i.class)&&(i.class+=" ".concat(a)),n.class=a;break;case"#":n.id=t.replace("#","");break;case"[":n[o]=r}}),n}function N(e,t){if(f.element(e)){var n=t;f.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function L(e,t,n){if(f.nodeList(e))return Array.from(e).map(function(e){return L(e,t,n)});if(f.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function x(e,t){return f.element(e)&&e.classList.contains(t)}function I(e,t){var n={Element:Element};return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function _(e){return this.elements.container.querySelectorAll(e)}function j(e){return this.elements.container.querySelector(e)}function O(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];f.element(e)&&(e.focus(),t&&L(e,this.config.classNames.tabFocus))}var q,R,B,V=(q=document.createElement("span"),R={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},B=Object.keys(R).find(function(e){return void 0!==q.style[e]}),!!f.string(B)&&R[B]);function H(e){setTimeout(function(){try{N(e,!0),e.offsetHeight,N(e,!1)}catch(e){}},0)}var D,F={isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)},U={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},z={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=F.isIPhone&&n&&z.playsinline,a=z[e]||"html5"!==t;return{api:a,ui:a&&z.rangeInput&&("video"!==e||!F.isIPhone||i)}},pip:!F.isIPhone&&f.function(A("video").webkitSetPresentationMode),airplay:f.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t,n=a(e.split("/"),1)[0];if(!this.isHTML5||n!==this.type)return!1;e&&e.includes("codecs=")?t=e:"audio/mpeg"===e?t="audio/mpeg;":e in U&&(t="".concat(e,'; codecs="').concat(U[e],'"'));try{return Boolean(t&&this.media.canPlayType(t).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(D=document.createElement("input"),D.type="range","range"===D.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==V,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},W={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return z.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return W.getSources.call(this).map(function(e){return Number(e.getAttribute("size"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=W.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("size"))},set:function(t){var n=W.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(n){var i=e.media,a=i.currentTime,s=i.paused,o=i.preload,r=i.readyState;e.media.src=n.getAttribute("src"),("none"!==o||r)&&(e.once("loadedmetadata",function(){e.currentTime=a,s||e.play()}),e.media.load()),k.call(e,e.media,"qualitychange",!1,{quality:t}),e.storage.set({quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(C(W.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function K(e){return f.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function Y(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function J(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];if(!n.length)return e;var s=n.shift();return f.object(s)?(Object.keys(s).forEach(function(t){f.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,i({},t,{})),J(e[t],s[t])):Object.assign(e,i({},t,s[t]))}),J.apply(void 0,[e].concat(n))):e}function Q(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return f.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function $(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1"),"g"),n.toString())}function G(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function X(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=$(e,"-"," "),e=$(e,"_"," "),$(e=G(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function Z(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var ee=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(f.empty(e)||f.empty(t))return"";var n=Y(t.i18n,e);if(f.empty(n))return"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=a(e,2),i=t[0],s=t[1];n=$(n,i,s)}),n},te=function(){function t(n){e(this,t),this.enabled=n.config.storage.enabled,this.key=n.config.storage.key}return n(t,[{key:"get",value:function(e){if(!t.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(f.empty(n))return null;var i=JSON.parse(n);return f.string(e)&&e.length?i[e]:i}},{key:"set",value:function(e){if(t.supported&&this.enabled&&f.object(e)){var n=this.get();f.empty(n)&&(n={}),J(n,e),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),t}();function ne(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var a=new XMLHttpRequest;if(!("withCredentials"in a))return;a.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(a.responseText))}catch(e){n(a.responseText)}else n(a.response)}),a.addEventListener("error",function(){throw new Error(a.status)}),a.open("GET",e,!0),a.responseType=t,a.send()}catch(e){i(e)}})}function ie(e,t){if(f.string(e)){var n=f.string(t),i=function(){return null!==document.getElementById(t)},a=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var s=te.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),n&&o.setAttribute("id",t),s){var r=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==r){var l=JSON.parse(r);a(o,l.content)}}ne(e).then(function(e){f.empty(e)||(s&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),a(o,e))}).catch(function(){})}}}var ae=function(e){return parseInt(e/60/60%60,10)},se=function(e){return parseInt(e/60%60,10)},oe=function(e){return parseInt(e%60,10)};function re(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!f.number(e))return re(null,t,n);var i=function(e){return"0".concat(e).slice(-2)},a=ae(e),s=se(e),o=oe(e);return a=t||a>0?"".concat(a,":"):"","".concat(n&&e>0?"-":"").concat(a).concat(i(s),":").concat(i(o))}var le={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||F.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=j.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:_.call(this,this.config.selectors.buttons.play),pause:j.call(this,this.config.selectors.buttons.pause),restart:j.call(this,this.config.selectors.buttons.restart),rewind:j.call(this,this.config.selectors.buttons.rewind),fastForward:j.call(this,this.config.selectors.buttons.fastForward),mute:j.call(this,this.config.selectors.buttons.mute),pip:j.call(this,this.config.selectors.buttons.pip),airplay:j.call(this,this.config.selectors.buttons.airplay),settings:j.call(this,this.config.selectors.buttons.settings),captions:j.call(this,this.config.selectors.buttons.captions),fullscreen:j.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=j.call(this,this.config.selectors.progress),this.elements.inputs={seek:j.call(this,this.config.selectors.inputs.seek),volume:j.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:j.call(this,this.config.selectors.display.buffer),currentTime:j.call(this,this.config.selectors.display.currentTime),duration:j.call(this,this.config.selectors.display.duration)},f.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip))),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=le.getIconUrl.call(this),i="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),a=document.createElementNS("http://www.w3.org/2000/svg","svg");T(a,J(t,{role:"presentation",focusable:"false"}));var s=document.createElementNS("http://www.w3.org/2000/svg","use"),o="".concat(i,"-").concat(e);return"href"in s?s.setAttributeNS("http://www.w3.org/1999/xlink","href",o):s.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),a.appendChild(s),a},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={pip:"PIP",airplay:"AirPlay"}[e]||ee(e,this.config);return A("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(f.empty(e))return null;var t=A("span",{class:this.config.classNames.menu.value});return t.appendChild(A("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n,i,a,s,o=A("button"),r=Object.assign({},t),l=X(e),c=!1;switch("type"in r||(r.type="button"),"class"in r?r.class.includes(this.config.classNames.control)||(r.class+=" ".concat(this.config.classNames.control)):r.class=this.config.classNames.control,e){case"play":c=!0,n="play",a="pause",i="play",s="pause";break;case"mute":c=!0,n="mute",a="unmute",i="volume",s="muted";break;case"captions":c=!0,n="enableCaptions",a="disableCaptions",i="captions-off",s="captions-on";break;case"fullscreen":c=!0,n="enterFullscreen",a="exitFullscreen",i="enter-fullscreen",s="exit-fullscreen";break;case"play-large":r.class+=" ".concat(this.config.classNames.control,"--overlaid"),l="play",n="play",i="play";break;default:n=l,i=e}return c?(o.appendChild(le.createIcon.call(this,s,{class:"icon--pressed"})),o.appendChild(le.createIcon.call(this,i,{class:"icon--not-pressed"})),o.appendChild(le.createLabel.call(this,a,{class:"label--pressed"})),o.appendChild(le.createLabel.call(this,n,{class:"label--not-pressed"}))):(o.appendChild(le.createIcon.call(this,i)),o.appendChild(le.createLabel.call(this,n))),J(r,M(this.config.selectors.buttons[l],r)),T(o,r),"play"===l?(f.array(this.elements.buttons[l])||(this.elements.buttons[l]=[]),this.elements.buttons[l].push(o)):this.elements.buttons[l]=o,o},createRange:function(e,t){var n=A("input",J(M(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":ee(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,le.updateRangeFill.call(this,n),n},createProgress:function(e,t){var n=A("progress",J(M(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(A("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],a=i?ee(i,this.config):"";n.innerText="% ".concat(a.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e){var t=M(this.config.selectors.display[e]),n=A("div",J(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":ee(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;y(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var a,s=I(e,'[role="menuitemradio"]');if(!s&&[32,39].includes(i.which))le.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||s&&39===i.which?(a=e.nextElementSibling,f.element(a)||(a=e.parentNode.firstElementChild)):(a=e.previousElementSibling,f.element(a)||(a=e.parentNode.lastElementChild)),O.call(n,a,!0))}},!1),y(e,"keyup",function(e){13===e.which&&le.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,a=e.type,s=e.title,o=e.badge,r=void 0===o?null:o,l=e.checked,c=void 0!==l&&l,u=M(this.config.selectors.inputs[a]),d=A("button",J(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=A("span");h.innerHTML=s,f.element(r)&&h.appendChild(r),d.appendChild(h),Object.defineProperty(d,"checked",{enumerable:!0,get:function(){return"true"===d.getAttribute("aria-checked")},set:function(e){e&&Array.from(d.parentNode.children).filter(function(e){return I(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),d.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(d,"click keyup",function(e){if(!f.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,a){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}le.showMenuPanel.call(t,"home",f.keyboardEvent(e))}},a,!1),le.bindMenuItemShortcuts.call(this,d,a),i.appendChild(d)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return f.number(e)?re(e,ae(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];f.element(e)&&f.number(t)&&(e.innerText=le.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(f.element(this.elements.inputs.volume)&&le.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),f.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;f.element(e)&&(e.value=t,le.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&f.event(e)){var n,i,a=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,a=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&le.setRange.call(this,this.elements.inputs.seek,a);break;case"playing":case"progress":!function(e,n){var i=f.number(n)?n:0,a=f.element(e)?e:t.elements.display.buffer;if(f.element(a)){a.value=i;var s=a.getElementsByTagName("span")[0];f.element(s)&&(s.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=f.event(e)?e.target:e;if(f.element(t)&&"range"===t.getAttribute("type")){if(I(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=le.formatTime(this.currentTime),i=le.formatTime(this.duration),a=ee("seekLabel",this.config);t.setAttribute("aria-valuetext",a.replace("{currentTime}",n).replace("{duration}",i))}else if(I(t,this.config.selectors.inputs.volume)){var s=100*t.value;t.setAttribute("aria-valuenow",s),t.setAttribute("aria-valuetext","".concat(s.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);F.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&f.element(this.elements.inputs.seek)&&f.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),a="".concat(this.config.classNames.tooltip,"--visible"),s=function(e){L(t.elements.display.seekTooltip,a,e)};if(this.touch)s(!1);else{if(f.event(e))n=100/i.width*(e.pageX-i.left);else{if(!x(this.elements.display.seekTooltip,a))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),le.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left="".concat(n,"%"),f.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&s("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!f.element(this.elements.display.duration)&&this.config.invertTime;le.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||le.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return N(this.elements.display.currentTime,!0),void N(this.elements.progress,!0);f.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=f.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&le.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&le.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),le.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){N(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],a=null,s=t;if("captions"===e)a=this.currentTrack;else{if(a=f.empty(n)?this[e]:n,f.empty(a)&&(a=this.config[e].default),!f.empty(this.options[e])&&!this.options[e].includes(a))return void this.debug.warn("Unsupported value of '".concat(a,"' for ").concat(e));if(!this.config[e].options.includes(a))return void this.debug.warn("Disabled value of '".concat(a,"' for ").concat(e))}if(f.element(s)||(s=i&&i.querySelector('[role="menu"]')),f.element(s)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=le.getLabel.call(this,e,a);var o=s&&s.querySelector('[value="'.concat(a,'"]'));f.element(o)&&(o.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?ee("normal",this.config):"".concat(t,"&times;");case"quality":if(f.number(t)){var n=ee("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return G(t);case"captions":return de.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(f.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');f.array(e)&&(this.options.quality=K(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!f.empty(this.options.quality)&&this.options.quality.length>1;if(le.toggleMenuButton.call(this,"quality",i),P(n),le.checkMenu.call(this),i){this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){le.createMenuItem.call(t,{value:e,list:n,type:"quality",title:le.getLabel.call(t,"quality",e),badge:function(e){var n=ee("qualityBadge.".concat(e),t.config);return n.length?le.createBadge.call(t,n):null}(e)})}),le.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(f.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=de.getTracks.call(this),i=Boolean(n.length);if(le.toggleMenuButton.call(this,"captions",i),P(t),le.checkMenu.call(this),i){var a=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:de.getLabel.call(e,n),badge:n.language&&le.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});a.unshift({value:-1,checked:!this.captions.toggled,title:ee("disabled",this.config),list:t,type:"language"}),a.forEach(le.createMenuItem.bind(this)),le.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(f.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');f.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var i=!f.empty(this.options.speed)&&this.options.speed.length>1;le.toggleMenuButton.call(this,"speed",i),P(n),le.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){le.createMenuItem.call(t,{value:e,list:n,type:"speed",title:le.getLabel.call(t,"speed",e)})}),le.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!f.empty(e)&&Object.values(e).some(function(e){return!e.hidden});N(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;f.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');O.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(f.element(t)&&f.element(n)){var i=t.hidden,a=i;if(f.boolean(e))a=e;else if(f.keyboardEvent(e)&&27===e.which)a=!1;else if(f.event(e)){var s=t.contains(e.target);if(s||!s&&e.target!==n&&a)return}n.setAttribute("aria-expanded",a),N(t,!a),L(this.elements.container,this.config.classNames.menu.open,a),a&&f.keyboardEvent(e)?le.focusFirstMenuItem.call(this,null,!0):a||i||O.call(this,n,f.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return C(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(f.element(i)){var a=i.parentNode,s=Array.from(a.children).find(function(e){return!e.hidden});if(z.transitions&&!z.reducedMotion){a.style.width="".concat(s.scrollWidth,"px"),a.style.height="".concat(s.scrollHeight,"px");var o=le.getMenuSize.call(this,i);y.call(this,a,V,function t(n){n.target===a&&["width","height"].includes(n.propertyName)&&(a.style.width="",a.style.height="",v.call(e,a,V,t))}),a.style.width="".concat(o.width,"px"),a.style.height="".concat(o.height,"px")}N(s,!0),N(i,!1),le.focusFirstMenuItem.call(this,i,n)}},create:function(e){var t=this,n=A("div",M(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(le.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(le.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(le.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(le.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=A("div",M(this.config.selectors.progress));if(i.appendChild(le.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),i.appendChild(le.createProgress.call(this,"buffer")),this.config.tooltips.seek){var a=A("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(a),this.elements.display.seekTooltip=a}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(le.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(le.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var s=A("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&s.appendChild(le.createButton.call(this,"mute")),this.config.controls.includes("volume")){var o={max:1,step:.05,value:this.config.volume};s.appendChild(le.createRange.call(this,"volume",J(o,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=s}n.appendChild(s)}if(this.config.controls.includes("captions")&&n.appendChild(le.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!f.empty(this.config.settings)){var r=A("div",{class:"plyr__menu",hidden:""});r.appendChild(le.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=A("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=A("div"),u=A("div",{id:"plyr-settings-".concat(e.id,"-home")}),d=A("div",{role:"menu"});u.appendChild(d),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=A("button",J(M(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));le.bindMenuItemShortcuts.call(t,i,n),y(i,"click",function(){le.showMenuPanel.call(t,n,!1)});var a=A("span",null,ee(n,t.config)),s=A("span",{class:t.config.classNames.menu.value});s.innerHTML=e[n],a.appendChild(s),i.appendChild(a),d.appendChild(i);var o=A("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),r=A("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});r.appendChild(A("span",{"aria-hidden":!0},ee(n,t.config))),r.appendChild(A("span",{class:t.config.classNames.hidden},ee("menuBack",t.config))),y(o,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),le.showMenuPanel.call(t,"home",!0))},!1),y(r,"click",function(){le.showMenuPanel.call(t,"home",!1)}),o.appendChild(r),o.appendChild(A("div",{role:"menu"})),c.appendChild(o),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=o}),l.appendChild(c),r.appendChild(l),n.appendChild(r),this.elements.settings.popup=l,this.elements.settings.menu=r}return this.config.controls.includes("pip")&&z.pip&&n.appendChild(le.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&z.airplay&&n.appendChild(le.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(le.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(le.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&le.setQualityMenu.call(this,W.getQualityOptions.call(this)),le.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=le.getIconUrl.call(this);t.cors&&ie(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},s=!0;f.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this.props)),this.config.controls||(this.config.controls=[]),f.element(this.config.controls)||f.string(this.config.controls)?n=this.config.controls:(n=le.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:de.getLabel.call(this)}),s=!1);var o,r=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=a(e,2),i=n[0],s=n[1];t=$(t,"{".concat(i,"}"),s)}),t};if(s&&(f.string(this.config.controls)?n=r(n):f.element(n)&&(n.innerHTML=r(n.innerHTML))),f.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),f.element(o)||(o=this.elements.container),o[f.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),f.element(this.elements.controls)||le.findElements.call(this),!f.empty(this.elements.buttons)){var l=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return x(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];L(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){f.array(e)||f.nodeList(e)?Array.from(e).filter(Boolean).forEach(l):l(e)})}if(window.navigator.userAgent.includes("Edge")&&H(o),this.config.tooltips.controls){var c=this.config,u=c.classNames,d=c.selectors,h="".concat(d.controls.wrapper," ").concat(d.labels," .").concat(u.hidden),p=_.call(this,h);Array.from(p).forEach(function(t){L(t,e.config.classNames.hidden,!1),L(t,e.config.classNames.tooltip,!0)})}}};function ce(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var n=document.createElement("a");n.href=t,t=n.href}try{return new URL(t)}catch(e){return null}}function ue(e){var t=new URLSearchParams;return f.object(e)&&Object.entries(e).forEach(function(e){var n=a(e,2),i=n[0],s=n[1];t.set(i,s)}),t}var de={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!z.textTracks)f.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&le.setCaptionsMenu.call(this);else{var e,t;if(f.element(this.elements.captions)||(this.elements.captions=A("div",M(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,f.element(e)&&f.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),F.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=ce(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&ne(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){C(e)})})}var i=K((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),s=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===s)s=a(i,1)[0];var o=this.storage.get("captions");if(f.boolean(o)||(o=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:o,language:s,languages:i}),this.isHTML5){var r=this.config.captions.update?"addtrack removetrack":"removetrack";y.call(this,this.media.textTracks,r,de.update.bind(this))}setTimeout(de.update.bind(this),0)}},update:function(){var e=this,t=de.getTracks.call(this,!0),n=this.captions,i=n.active,a=n.language,s=n.meta,o=n.currentTrackNode,r=Boolean(t.find(function(e){return e.language===a}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!s.get(e)}).forEach(function(t){e.debug.log("Track added",t),s.set(t,{default:"showing"===t.mode}),t.mode="hidden",y.call(e,t,"cuechange",function(){return de.updateCues.call(e)})}),(r&&this.language!==a||!t.includes(o))&&(de.setLanguage.call(this,a),de.toggle.call(this,i&&r)),L(this.elements.container,this.config.classNames.captions.enabled,!f.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&le.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,a=f.nullOrUndefined(e)?!n:e;if(a!==n){if(t||(this.captions.active=a,this.storage.set({captions:a})),!this.language&&a&&!t){var o=de.getTracks.call(this),r=de.findTrack.call(this,[this.captions.language].concat(s(this.captions.languages)),!0);return this.captions.language=r.language,void de.set.call(this,o.indexOf(r))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=a),L(this.elements.container,i,a),this.captions.toggled=a,le.updateSetting.call(this,"captions"),k.call(this,this.media,a?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=de.getTracks.call(this);if(-1!==e)if(f.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],a=(i||{}).language;this.captions.currentTrackNode=i,le.updateSetting.call(this,"captions"),t||(this.captions.language=a,this.storage.set({language:a})),this.isVimeo&&this.embed.enableTextTrack(a),k.call(this,this.media,"languagechange")}de.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&de.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else de.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(f.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=de.getTracks.call(this),a=de.findTrack.call(this,[n]);de.set.call(this,i.indexOf(a),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t,n=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=de.getTracks.call(this),s=function(e){return Number((n.captions.meta.get(e)||{}).default)},o=Array.from(a).sort(function(e,t){return s(t)-s(e)});return e.every(function(e){return!(t=o.find(function(t){return t.language===e}))}),t||(i?o[0]:void 0)},getCurrentTrack:function(){return de.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!f.track(t)&&z.textTracks&&this.captions.toggled&&(t=de.getCurrentTrack.call(this)),f.track(t)?f.empty(t.label)?f.empty(t.language)?ee("enabled",this.config):e.language.toUpperCase():t.label:ee("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(f.element(this.elements.captions))if(f.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=de.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(Z)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){P(this.elements.captions);var a=A("span",M(this.config.selectors.caption));a.innerHTML=i,this.elements.captions.appendChild(a),k.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},he={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},pe={html5:"html5",youtube:"youtube",vimeo:"vimeo"},fe={audio:"audio",video:"video"};var me=function(){},ge=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e(this,t),this.enabled=window.console&&n,this.enabled&&this.log("Debugging enabled")}return n(t,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):me}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):me}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):me}}]),t}();function ye(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;f.element(e)&&(e.pressed=this.active),k.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),F.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(f.element(e)){var n=_.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],a=n[n.length-1];g.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==a||e.shiftKey?t===i&&e.shiftKey&&(a.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function ve(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",L(this.target,this.player.config.classNames.fullscreen.fallback,t),F.isIos){var n=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";n||(n=document.createElement("meta")).setAttribute("name","viewport");var a=f.string(n.content)&&n.content.includes(i);t?(this.cleanupViewport=!a,a||(n.content+=",".concat(i))):this.cleanupViewport&&(n.content=n.content.split(",").filter(function(e){return e.trim()!==i}).join(",")),setTimeout(function(){return H(e.target)},100)}ye.call(this)}var be=function(){function t(n){var i=this;e(this,t),this.player=n,this.prefix=t.prefix,this.property=t.property,this.scrollPosition={x:0,y:0},y.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){ye.call(i)}),y.call(this.player,this.player.elements.container,"dblclick",function(e){f.element(i.player.elements.controls)&&i.player.elements.controls.contains(e.target)||i.toggle()}),this.update()}return n(t,[{key:"update",value:function(){this.enabled?this.player.debug.log("".concat(t.native?"Native":"Fallback"," fullscreen enabled")):this.player.debug.log("Fullscreen not supported and fallback disabled"),L(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(F.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():t.native?this.prefix?f.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen():ve.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(F.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(t.native)if(this.prefix){if(!f.empty(this.prefix)){var e="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(e).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else ve.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(t.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(t.native?(this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target:x(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return F.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(f.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!f.function(document["".concat(t,"ExitFullscreen")])&&!f.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),t}();function ke(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var a=new Image,s=function(){delete a.onload,delete a.onerror,(a.naturalWidth>=t?n:i)(a)};Object.assign(a,{onload:s,onerror:s,src:e})})}var we={addStyleHook:function(){L(this.elements.container,this.config.selectors.container.replace(".",""),!0),L(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for ".concat(this.provider," ").concat(this.type)),void we.toggleNativeControls.call(this,!0);f.element(this.elements.controls)||(le.inject.call(this),this.listeners.controls()),we.toggleNativeControls.call(this),this.isHTML5&&de.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,le.updateVolume.call(this),le.timeUpdate.call(this),we.checkPlaying.call(this),L(this.elements.container,this.config.classNames.pip.supported,z.pip&&this.isHTML5&&this.isVideo),L(this.elements.container,this.config.classNames.airplay.supported,z.airplay&&this.isHTML5),L(this.elements.container,this.config.classNames.isIos,F.isIos),L(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){k.call(e,e.media,"ready")},0),we.setTitle.call(this),this.poster&&we.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&le.durationUpdate.call(this)},setTitle:function(){var e=ee("play",this.config);if(f.string(this.config.title)&&!f.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=j.call(this,"iframe");if(!f.element(t))return;var n=f.empty(this.config.title)?"video":this.config.title,i=ee("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){L(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):y.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return ke(e)}).catch(function(n){throw e===t.poster&&we.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),we.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;L(this.elements.container,this.config.classNames.playing,this.playing),L(this.elements.container,this.config.classNames.paused,this.paused),L(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),f.event(e)&&"timeupdate"===e.type||we.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){L(t.elements.container,t.config.classNames.loading,t.loading),we.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},Te=function(){function t(n){e(this,t),this.player=n,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return n(t,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,a="keydown"===e.type,s=a&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&f.number(i)){if(a){var o=document.activeElement;if(f.element(o)){var r=t.config.selectors.editable;if(o!==n.inputs.seek&&I(o,r))return;if(32===e.which&&I(o,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:s||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:s||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:s||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:s||t.toggleCaptions();break;case 76:t.loop=!t.loop}!t.fullscreen.enabled&&t.fullscreen.active&&27===i&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){le.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,L(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,a=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||a)i=t.config.classNames.tabFocus,L(_.call(t,".".concat(i)),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&L(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&g.call(t,window,"keydown keyup",this.handleKey,e,!1),g.call(t,document.body,"click",this.toggleMenu,e),b.call(t,document.body,"touchstart",this.firstTouch),g.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.elements;!e.config.keyboard.global&&e.config.keyboard.focused&&y.call(e,t.container,"keydown keyup",this.handleKey,!1),y.call(e,t.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(n){var i=t.controls;i&&"enterfullscreen"===n.type&&(i.pressed=!1,i.hover=!1);var a=0;["touchstart","touchmove","mousemove"].includes(n.type)&&(we.toggleControls.call(e,!0),a=e.touch?3e3:2e3),clearTimeout(e.timers.controls),e.timers.controls=setTimeout(function(){return we.toggleControls.call(e,!1)},a)})}},{key:"media",value:function(){var e=this.player,t=e.elements;if(y.call(e,e.media,"timeupdate seeking seeked",function(t){return le.timeUpdate.call(e,t)}),y.call(e,e.media,"durationchange loadeddata loadedmetadata",function(t){return le.durationUpdate.call(e,t)}),y.call(e,e.media,"canplay",function(){N(t.volume,!e.hasAudio),N(t.buttons.mute,!e.hasAudio)}),y.call(e,e.media,"ended",function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&e.restart()}),y.call(e,e.media,"progress playing seeking seeked",function(t){return le.updateProgress.call(e,t)}),y.call(e,e.media,"volumechange",function(t){return le.updateVolume.call(e,t)}),y.call(e,e.media,"playing play pause ended emptied timeupdate",function(t){return we.checkPlaying.call(e,t)}),y.call(e,e.media,"waiting canplay seeked playing",function(t){return we.checkLoading.call(e,t)}),y.call(e,e.media,"playing",function(){e.ads&&e.ads.enabled&&!e.ads.initialized&&e.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.play()})}),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var n=j.call(e,".".concat(e.config.classNames.video));if(!f.element(n))return;y.call(e,t.container,"click",function(i){([t.container,n].includes(i.target)||n.contains(i.target))&&(e.touch&&e.config.hideControls||(e.ended?(e.restart(),e.play()):e.togglePlay()))})}e.supported.ui&&e.config.disableContextMenu&&y.call(e,t.wrapper,"contextmenu",function(e){e.preventDefault()},!1),y.call(e,e.media,"volumechange",function(){e.storage.set({volume:e.volume,muted:e.muted})}),y.call(e,e.media,"ratechange",function(){le.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),y.call(e,e.media,"qualitychange",function(t){le.updateSetting.call(e,"quality",null,t.detail.quality)});var i=e.config.events.concat(["keyup","keydown"]).join(" ");y.call(e,e.media,i,function(n){var i=n.detail,a=void 0===i?{}:i;"error"===n.type&&(a=e.media.error),k.call(e,t.container,n.type,!0,a)})}},{key:"proxy",value:function(e,t,n){var i=this.player,a=i.config.listeners[n],s=!0;f.function(a)&&(s=a.call(i,e)),s&&f.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var a=this,s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=this.player,r=o.config.listeners[i],l=f.function(r);y.call(o,e,t,function(e){return a.proxy(e,n,i)},s&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=F.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),le.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),le.toggleMenu.call(t,e)):le.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&le.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!f.keyboardEvent(e)||39===i||37===i){var a=n.hasAttribute("play-on-seeked"),s=["mouseup","touchend","keyup"].includes(e.type);a&&s?(n.removeAttribute("play-on-seeked"),t.play()):!s&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),F.isIos){var s=_.call(t,'input[type="range"]');Array.from(s).forEach(function(t){return e.bind(t,i,function(e){return H(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");f.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return le.updateSeekTooltip.call(t,e)}),F.isWebkit&&Array.from(_.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return le.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!f.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,le.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin focusout",function(n){var i=t.config,a=t.elements,s=t.timers,o="focusin"===n.type;if(L(a.controls,i.classNames.noTransition,o),we.toggleControls.call(t,o),o){setTimeout(function(){L(a.controls,i.classNames.noTransition,!1)},0);var r=e.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout(function(){return we.toggleControls.call(t,!1)},r)}}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=a([e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),2),s=i[0],o=i[1],r=Math.sign(Math.abs(s)>Math.abs(o)?s:o);t.increaseVolume(r/50);var l=t.media.volume;(1===r&&l<1||-1===r&&l>0)&&e.preventDefault()},"volume",!1)}}]),t}();"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ae,Ee=(function(e,t){var n;n=function(){var e=function(){},t={},n={},i={};function a(e,t){if(e){var a=i[e];if(n[e]=t,a)for(;a.length;)a[0](e,t),a.splice(0,1)}}function s(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function o(t,n,i,a){var s,r,l=document,c=i.async,u=(i.numRetries||0)+1,d=i.before||e,h=t.replace(/^(css|img)!/,"");a=a||0,/(^css!|\.css$)/.test(t)?(s=!0,(r=l.createElement("link")).rel="stylesheet",r.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(r=l.createElement("img")).src=h:((r=l.createElement("script")).src=t,r.async=void 0===c||c),r.onload=r.onerror=r.onbeforeload=function(e){var l=e.type[0];if(s&&"hideFocus"in r)try{r.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(a+=1)<u)return o(t,n,i,a);n(t,l,e.defaultPrevented)},!1!==d(t,r)&&l.head.appendChild(r)}function r(e,n,i){var r,l;if(n&&n.trim&&(r=n),l=(r?i:n)||{},r){if(r in t)throw"LoadJS";t[r]=!0}!function(e,t,n){var i,a,s=(e=e.push?e:[e]).length,r=s,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--s||t(l)},a=0;a<r;a++)o(e[a],i,n)}(e,function(e){s(l,e),a(r,e)},l)}return r.ready=function(e,t){return function(e,t){e=e.push?e:[e];var a,s,o,r=[],l=e.length,c=l;for(a=function(e,n){n.length&&r.push(e),--c||t(r)};l--;)s=e[l],(o=n[s])?a(s,o):(i[s]=i[s]||[]).push(a)}(e,function(e){s(t,e)}),r},r.done=function(e){a(e,[])},r.reset=function(){t={},n={},i={}},r.isDefined=function(e){return e in t},r},e.exports=n()}(Ae={exports:{}},Ae.exports),Ae.exports);function Ce(e){return new Promise(function(t,n){Ee(e,{success:t,error:n})})}function Pe(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,k.call(this,this.media,e?"play":"pause"))}var Se={setup:function(){var e=this;L(this.elements.wrapper,this.config.classNames.embed,!0),Se.setAspectRatio.call(this),f.object(window.Vimeo)?Se.ready.call(this):Ce(this.config.urls.vimeo.sdk).then(function(){Se.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=a((f.string(e)?e:this.config.ratio).split(":"),2),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom="".concat(n,"%"),this.supported.ui){var i=(240-n)/4.8;this.media.style.transform="translateY(-".concat(i,"%)")}},ready:function(){var e=this,t=this,n=ue({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),i=t.media.getAttribute("src");f.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var a,s=(a=i,f.empty(a)?null:f.number(Number(a))?a:a.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:a),o=A("iframe"),r=Q(t.config.urls.vimeo.iframe,s,n);o.setAttribute("src",r),o.setAttribute("allowfullscreen",""),o.setAttribute("allowtransparency",""),o.setAttribute("allow","autoplay");var l=A("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(o),t.media=S(l,t.media),ne(Q(t.config.urls.vimeo.api,s),"json").then(function(e){if(!f.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname="".concat(n.pathname.split("_")[0],".jpg"),we.setPoster.call(t,n.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(o,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return Pe.call(t,!0),t.embed.play()},t.media.pause=function(){return Pe.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var n=t.embed,i=t.media,a=t.paused,s=t.volume,o=a&&!n.hasPlayed;i.seeking=!0,k.call(t,i,"seeking"),Promise.resolve(o&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return o&&n.pause()}).then(function(){return o&&n.setVolume(s)}).catch(function(){})}});var u=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return u},set:function(e){t.embed.setPlaybackRate(e).then(function(){u=e,k.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&le.setSpeedMenu.call(t,[])})}});var d=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return d},set:function(e){t.embed.setVolume(e).then(function(){d=e,k.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!f.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,k.call(t,t.media,"volumechange")})}});var p,m=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return m},set:function(e){var n=f.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){m=n})}}),t.embed.getVideoUrl().then(function(e){p=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return p}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var n=function(e,t){var n=function e(t,n){return 0===n?t:e(n,t%n)}(e,t);return"".concat(e/n,":").concat(t/n)}(t[0],t[1]);Se.setAspectRatio.call(e,n)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,we.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,k.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,k.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,de.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return t=e.text,n=document.createDocumentFragment(),i=document.createElement("div"),n.appendChild(i),i.innerHTML=t,n.firstChild.innerText;var t,n,i});de.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){Pe.call(t,!e),e||k.call(t,t.media,"playing")}),f.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){Pe.call(t,!0),k.call(t,t.media,"playing")}),t.embed.on("pause",function(){Pe.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,k.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,k.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&k.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,k.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,k.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,k.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,k.call(t,t.media,"error")}),setTimeout(function(){return we.build.call(t)},0)}};function Me(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,k.call(this,this.media,e?"play":"pause"))}var Ne,Le={setup:function(){var e=this;L(this.elements.wrapper,this.config.classNames.embed,!0),Le.setAspectRatio.call(this),f.object(window.YT)&&f.function(window.YT.Player)?Le.ready.call(this):(Ce(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){Le.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(f.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(f.empty(n))return this.config.title=n,void we.setTitle.call(this)}var i=this.config.keys.google;f.string(i)&&!f.empty(i)&&ne(Q(this.config.urls.youtube.api,e,i)).then(function(e){f.object(e)&&(t.config.title=e.items[0].snippet.title,we.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom="".concat(100/e[0]*e[1],"%")},ready:function(){var e=this,t=e.media.getAttribute("id");if(f.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");f.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,a,s=(i=n,f.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),o=(a=e.provider,"".concat(a,"-").concat(Math.floor(1e4*Math.random()))),r=A("div",{id:o,poster:e.poster});e.media=S(r,e.media);var l=function(e){return"https://img.youtube.com/vi/".concat(s,"/").concat(e,"default.jpg")};ke(l("maxres"),121).catch(function(){return ke(l("sd"),121)}).catch(function(){return ke(l("hq"))}).then(function(t){return we.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(o,{videoId:s,playerVars:{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!e.media.error){var n=t.data,i={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},k.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),k.call(e,e.media,"ratechange")},onReady:function(t){if(!f.function(e.media.play)){var n=t.target;Le.getTitle.call(e,s),e.media.play=function(){Me.call(e,!0),n.playVideo()},e.media.pause=function(){Me.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,k.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),k.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var i=f.boolean(t)?t:a;a=i,n[i?"mute":"unMute"](),k.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),k.call(e,e.media,"timeupdate"),k.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&k.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),k.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return we.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,k.call(e,e.media,"seeked")),t.data){case-1:k.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),k.call(e,e.media,"progress");break;case 0:Me.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):k.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Me.call(e,!0),k.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){k.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),k.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Me.call(e,!1)}k.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},xe={setup:function(){this.media?(L(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),L(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&L(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=A("div",{class:this.config.classNames.video}),w(this.media,this.elements.wrapper),this.elements.poster=A("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?W.extend.call(this):this.isYouTube?Le.setup.call(this):this.isVimeo&&Se.setup.call(this)):this.debug.warn("No media element found!")}},Ie=function(){function t(n){var i=this;e(this,t),this.player=n,this.publisherId=n.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){i.on("loaded",e),i.on("error",t)}),this.load()}return n(t,[{key:"load",value:function(){var e=this;this.enabled&&(f.object(window.google)&&f.object(window.google.ima)?this.ready():Ce(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=A("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=re(Math.max(e.manager.getRemainingTime(),0)),n="".concat(ee("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),f.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(f.element(n)){var i=100/t.player.duration*e,a=A("span",{class:t.player.config.classNames.cues});a.style.left="".concat(i.toString(),"%"),n.appendChild(a)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),a=function(e){var n="ads".concat(e.replace(/_/g,"").toLowerCase());k.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),a(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:a(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:a(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:a(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:a(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e,t=this,n=this.player.elements.container;this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("seeking",function(){return e=t.player.currentTime}),this.player.on("seeked",function(){var n=t.player.currentTime;f.empty(t.cuePoints)||t.cuePoints.forEach(function(i,a){e<i&&i<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(a,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(n.offsetWidth,n.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=new Array(n>1?n-1:0),a=1;a<n;a++)i[a-1]=arguments[a];var s=this.events[e];f.array(s)&&s.forEach(function(e){f.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return f.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: ".concat(t)),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){f.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.ads.enabled&&!f.empty(this.publisherId)}},{key:"tagUrl",get:function(){var e={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(ue(e))}}]),t}(),_e={insertElements:function(e,t){var n=this;f.string(t)?E(e,this.media,{src:t}):f.array(t)&&t.forEach(function(t){E(e,n.media,t)})},change:function(e){var t=this;Y(e,"sources.length")?(W.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],C(t.media),t.media=null,f.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,s=a(n,1)[0],o=s.provider,r=void 0===o?pe.html5:o,l=s.src,c="html5"===r?i:"div",u="html5"===r?{}:{src:l};Object.assign(t,{provider:r,type:i,supported:z.check(i,r,t.config.playsinline),media:A(c,u)}),t.elements.container.appendChild(t.media),f.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),f.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),we.addStyleHook.call(t),t.isHTML5&&_e.insertElements.call(t,"source",n),t.config.title=e.title,xe.setup.call(t),t.isHTML5&&("tracks"in e&&_e.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&we.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},je=function(){function t(n,i){var a=this;if(e(this,t),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=z.touch,this.media=n,f.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||f.nodeList(this.media)||f.array(this.media))&&(this.media=this.media[0]),this.config=J({},he,t.defaults,i||{},function(){try{return JSON.parse(a.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new ge(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",z),!f.nullOrUndefined(this.media)&&f.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(z.check().api){var s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;var o=this.media.tagName.toLowerCase(),r=null,l=null;switch(o){case"div":if(r=this.media.querySelector("iframe"),f.element(r)){if(l=ce(r.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?pe.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?pe.vimeo:null}(l.toString()),this.elements.container=this.media,this.media=r,this.elements.container.className="",l.search.length){var c=["1","true"];c.includes(l.searchParams.get("autoplay"))&&(this.config.autoplay=!0),c.includes(l.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=c.includes(l.searchParams.get("playsinline")),this.config.hl=l.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(f.empty(this.provider)||!Object.keys(pe).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=fe.video;break;case"video":case"audio":this.type=o,this.provider=pe.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=z.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Te(this),this.storage=new te(this),this.media.plyr=this,f.element(this.elements.container)||(this.elements.container=A("div"),w(this.media,this.elements.container)),we.addStyleHook.call(this),xe.setup.call(this),this.config.debug&&y.call(this,this.elements.container,this.config.events.join(" "),function(e){a.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&we.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new be(this),this.config.ads.enabled&&(this.ads=new Ie(this)),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return n(t,[{key:"play",value:function(){return f.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&f.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(f.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):f.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(f.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(f.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(f.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){de.toggle.call(this,e,!1)}},{key:"airplay",value:function(){z.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=x(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=L(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!f.empty(this.config.settings)&&le.toggleMenu.call(this,!1),i!==t){var a=i?"controlshidden":"controlsshown";k.call(this,this.media,a)}return!i}return!1}},{key:"on",value:function(e,t){y.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){b.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){v(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(C(t.elements.buttons.play),C(t.elements.captions),C(t.elements.controls),C(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),f.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,a=e.options;t.removeEventListener(n,i,a)}),this.eventListeners=[])}.call(t),S(t.elements.original,t.elements.container),k.call(t,t.elements.original,"destroyed",!0),f.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),we.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&f.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return z.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===pe.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===pe.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===pe.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===fe.video)}},{key:"isAudio",get:function(){return Boolean(this.type===fe.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=f.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return f.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration,n=f.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;f.string(t)&&(t=Number(t)),f.number(t)||(t=this.storage.get("volume")),f.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!f.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;f.boolean(t)||(t=this.storage.get("muted")),f.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;f.number(e)&&(t=e),f.number(t)||(t=this.storage.get("speed")),f.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed (".concat(t,")"))},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!f.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(f.number);if(!n.includes(i)){var a=function(e,t){return f.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null}(n,i);this.debug.warn("Unsupported quality option: ".concat(i,", using ").concat(a," instead")),i=a}t.selected=i,this.media.quality=i}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=f.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){_e.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?we.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=f.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){de.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){de.setLanguage.call(this,e,!1)},get:function(){return(de.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(z.pip){var i=f.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return z.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return z.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return ie(e,t)}},{key:"setup",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return f.string(e)?i=Array.from(document.querySelectorAll(e)):f.nodeList(e)?i=Array.from(e):f.array(e)&&(i=e.filter(f.element)),f.empty(i)?null:i.map(function(e){return new t(e,n)})}}]),t}();return je.defaults=(Ne=he,JSON.parse(JSON.stringify(Ne))),je});
//# sourceMappingURL=plyr.min.js.map
diff --git a/dist/plyr.min.js.map b/dist/plyr.min.js.map
index 36ff8799..d5425a75 100644
--- a/dist/plyr.min.js.map
+++ b/dist/plyr.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isString","String","isArray","Array","isNodeList","NodeList","isEmpty","length","keys","is","nullOrUndefined","object","number","Number","isNaN","string","boolean","function","Function","array","weakMap","WeakMap","nodeList","element","Element","textNode","Text","event","Event","keyboardEvent","KeyboardEvent","cue","window","TextTrackCue","VTTCue","track","TextTrack","kind","url","URL","startsWith","hostname","e","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","arguments","undefined","_this","this","passive","capture","events","split","forEach","type","eventListeners","push","on","call","off","once","onceCallback","_len","args","_key","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","wrap","elements","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","_ref","value","slicedToArray","_ref3","_ref4","key","setAttribute","createElement","text","document","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hidden","hide","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","includes","getElements","container","getElement","querySelector","setFocus","tabFocus","focus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","repaint","setTimeout","offsetHeight","range","browser","isIE","documentMode","isWebkit","documentElement","test","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","_inputType$split","mediaType","isHTML5","media","canPlayType","err","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","source","getAttribute","getQualityOptions","extend","player","set","_player$media","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","item","indexOf","getDeep","path","reduce","obj","target","sources","shift","concat","format","toString","match","i","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","slice","getHTML","innerHTML","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","classCallCheck","enabled","store","localStorage","getItem","json","JSON","parse","setItem","stringify","removeItem","fetch","responseType","Promise","resolve","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","prefix","content","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","location","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","createRange","min","max","step","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","preventDefault","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_this2","list","_ref$badge","_ref$checked","checked","aria-checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this4","tooltips","clientRect","getBoundingClientRect","visible","_toggle","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","Math","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","sort","a","b","sorting","getBadge","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","create","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","inject","_this10","floor","random","props","seektime","addProperty","controlPressed","_config","labels","parseUrl","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","active","trackEvents","_captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","toConsumableArray","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","urls","vimeo","sdk","iframe","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","noop","Console","console","onChange","first","last","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","Fullscreen","property","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","proxy","inputEvent","rect","currentTarget","hasAttribute","done","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","_map","deltaX","deltaY","_map2","direction","sign","abs","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","splice","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","defaultPrevented","head","loadjs","paths","arg1","arg2","fn","numWaiting","loadFiles","deps","bundleIds","r","subscribe","isDefined","module","exports","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split","_split2","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","w","h","getAspectRatio","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","format$$1","playerVars","hl","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","_this11","handlers","_this12","base","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","attribute","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","original","getProviderByUrl","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","closest","states","webkitPresentationMode","inline","t"],"mappings":"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","file":"plyr.min.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(\n event => element.style[event] !== undefined,\n );\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n toggle = true;\n type = 'play';\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, hasClass, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { format, stripHTML } from '../utils/strings';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { format, generateId } from '../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.4.3\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
+{"version":3,"sources":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isString","String","isArray","Array","isNodeList","NodeList","isEmpty","length","keys","is","nullOrUndefined","object","number","Number","isNaN","string","boolean","function","Function","array","weakMap","WeakMap","nodeList","element","Element","textNode","Text","event","Event","keyboardEvent","KeyboardEvent","cue","window","TextTrackCue","VTTCue","track","TextTrack","kind","url","URL","startsWith","concat","hostname","e","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","_this","this","toggle","arguments","undefined","passive","capture","events","split","forEach","type","eventListeners","push","on","call","off","once","onceCallback","_len","args","_key","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","wrap","elements","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","_ref","value","_slicedToArray","_ref3","_ref4","key","setAttribute","createElement","text","document","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hidden","hide","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","includes","getElements","container","getElement","querySelector","setFocus","tabFocus","focus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","repaint","setTimeout","offsetHeight","range","browser","isIE","documentMode","isWebkit","documentElement","test","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","source","getAttribute","getQualityOptions","extend","player","set","_player$media","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","item","indexOf","getDeep","path","reduce","obj","target","sources","shift","_defineProperty","format","toString","match","i","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","slice","getHTML","innerHTML","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","_classCallCheck","enabled","store","localStorage","getItem","json","JSON","parse","setItem","stringify","removeItem","fetch","responseType","Promise","resolve","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","location","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","button","control","createRange","min","max","step","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","preventDefault","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_this2","list","_ref$badge","_ref$checked","checked","aria-checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this4","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","Math","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","sort","a","b","sorting","getBadge","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","create","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","inject","_this10","floor","random","props","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","active","trackEvents","_this$captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","_toConsumableArray","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","urls","vimeo","sdk","iframe","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","noop","Console","console","onChange","first","last","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","prefix","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","proxy","inputEvent","rect","currentTarget","hasAttribute","done","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","sign","abs","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","splice","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","defaultPrevented","loadjs","paths","arg1","arg2","fn","numWaiting","loadFiles","deps","bundleIds","r","subscribe","isDefined","module","exports","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split2","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","w","h","getAspectRatio","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","_this11","handlers","_this12","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","attribute","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","original","getProviderByUrl","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","closest","states","webkitPresentationMode","inline","t"],"mappings":"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","file":"plyr.min.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { format, stripHTML } from '../utils/strings';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { format, generateId } from '../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.4.4\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
diff --git a/dist/plyr.polyfilled.js b/dist/plyr.polyfilled.js
index 34ab28a9..b4195616 100644
--- a/dist/plyr.polyfilled.js
+++ b/dist/plyr.polyfilled.js
@@ -1,13861 +1,10308 @@
typeof navigator === "object" && (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define('Plyr', factory) :
- (global.Plyr = factory());
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define('Plyr', factory) :
+ (global.Plyr = factory());
}(this, (function () { 'use strict';
- var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
- function createCommonjsModule(fn, module) {
- return module = { exports: {} }, fn(module, module.exports), module.exports;
- }
-
- var _global = createCommonjsModule(function (module) {
- // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
- var global = module.exports = typeof window != 'undefined' && window.Math == Math
- ? window : typeof self != 'undefined' && self.Math == Math ? self
- // eslint-disable-next-line no-new-func
- : Function('return this')();
- if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
- });
-
- var _core = createCommonjsModule(function (module) {
- var core = module.exports = { version: '2.5.7' };
- if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
- });
- var _core_1 = _core.version;
-
- var _isObject = function (it) {
- return typeof it === 'object' ? it !== null : typeof it === 'function';
- };
-
- var _anObject = function (it) {
- if (!_isObject(it)) throw TypeError(it + ' is not an object!');
- return it;
- };
-
- var _fails = function (exec) {
- try {
- return !!exec();
- } catch (e) {
- return true;
- }
- };
-
- // Thank's IE8 for his funny defineProperty
- var _descriptors = !_fails(function () {
- return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
- });
-
- var document$1 = _global.document;
- // typeof document.createElement is 'object' in old IE
- var is = _isObject(document$1) && _isObject(document$1.createElement);
- var _domCreate = function (it) {
- return is ? document$1.createElement(it) : {};
- };
-
- var _ie8DomDefine = !_descriptors && !_fails(function () {
- return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
- });
-
- // 7.1.1 ToPrimitive(input [, PreferredType])
-
- // instead of the ES6 spec version, we didn't implement @@toPrimitive case
- // and the second argument - flag - preferred type is a string
- var _toPrimitive = function (it, S) {
- if (!_isObject(it)) return it;
- var fn, val;
- if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
- if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;
- if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
- throw TypeError("Can't convert object to primitive value");
- };
-
- var dP = Object.defineProperty;
-
- var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
- _anObject(O);
- P = _toPrimitive(P, true);
- _anObject(Attributes);
- if (_ie8DomDefine) try {
- return dP(O, P, Attributes);
- } catch (e) { /* empty */ }
- if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
- if ('value' in Attributes) O[P] = Attributes.value;
- return O;
- };
-
- var _objectDp = {
- f: f
- };
-
- var _propertyDesc = function (bitmap, value) {
- return {
- enumerable: !(bitmap & 1),
- configurable: !(bitmap & 2),
- writable: !(bitmap & 4),
- value: value
- };
- };
-
- var _hide = _descriptors ? function (object, key, value) {
- return _objectDp.f(object, key, _propertyDesc(1, value));
- } : function (object, key, value) {
- object[key] = value;
- return object;
- };
-
- var hasOwnProperty = {}.hasOwnProperty;
- var _has = function (it, key) {
- return hasOwnProperty.call(it, key);
- };
-
- var id = 0;
- var px = Math.random();
- var _uid = function (key) {
- return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
- };
-
- var _redefine = createCommonjsModule(function (module) {
- var SRC = _uid('src');
- var TO_STRING = 'toString';
- var $toString = Function[TO_STRING];
- var TPL = ('' + $toString).split(TO_STRING);
-
- _core.inspectSource = function (it) {
- return $toString.call(it);
- };
-
- (module.exports = function (O, key, val, safe) {
- var isFunction = typeof val == 'function';
- if (isFunction) _has(val, 'name') || _hide(val, 'name', key);
- if (O[key] === val) return;
- if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
- if (O === _global) {
- O[key] = val;
- } else if (!safe) {
- delete O[key];
- _hide(O, key, val);
- } else if (O[key]) {
- O[key] = val;
- } else {
- _hide(O, key, val);
- }
- // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
- })(Function.prototype, TO_STRING, function toString() {
- return typeof this == 'function' && this[SRC] || $toString.call(this);
- });
- });
-
- var _aFunction = function (it) {
- if (typeof it != 'function') throw TypeError(it + ' is not a function!');
- return it;
- };
-
- // optional / simple context binding
-
- var _ctx = function (fn, that, length) {
- _aFunction(fn);
- if (that === undefined) return fn;
- switch (length) {
- case 1: return function (a) {
- return fn.call(that, a);
- };
- case 2: return function (a, b) {
- return fn.call(that, a, b);
- };
- case 3: return function (a, b, c) {
- return fn.call(that, a, b, c);
- };
- }
- return function (/* ...args */) {
- return fn.apply(that, arguments);
- };
- };
-
- var PROTOTYPE = 'prototype';
-
- var $export = function (type, name, source) {
- var IS_FORCED = type & $export.F;
- var IS_GLOBAL = type & $export.G;
- var IS_STATIC = type & $export.S;
- var IS_PROTO = type & $export.P;
- var IS_BIND = type & $export.B;
- var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];
- var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
- var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
- var key, own, out, exp;
- if (IS_GLOBAL) source = name;
- for (key in source) {
- // contains in native
- own = !IS_FORCED && target && target[key] !== undefined;
- // export native or passed
- out = (own ? target : source)[key];
- // bind timers to global for call from export context
- exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
- // extend global
- if (target) _redefine(target, key, out, type & $export.U);
- // export
- if (exports[key] != out) _hide(exports, key, exp);
- if (IS_PROTO && expProto[key] != out) expProto[key] = out;
- }
- };
- _global.core = _core;
- // type bitmap
- $export.F = 1; // forced
- $export.G = 2; // global
- $export.S = 4; // static
- $export.P = 8; // proto
- $export.B = 16; // bind
- $export.W = 32; // wrap
- $export.U = 64; // safe
- $export.R = 128; // real proto method for `library`
- var _export = $export;
-
- var TYPED = _uid('typed_array');
- var VIEW = _uid('view');
- var ABV = !!(_global.ArrayBuffer && _global.DataView);
- var CONSTR = ABV;
- var i = 0;
- var l = 9;
- var Typed;
-
- var TypedArrayConstructors = (
- 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'
- ).split(',');
-
- while (i < l) {
- if (Typed = _global[TypedArrayConstructors[i++]]) {
- _hide(Typed.prototype, TYPED, true);
- _hide(Typed.prototype, VIEW, true);
- } else CONSTR = false;
- }
-
- var _typed = {
- ABV: ABV,
- CONSTR: CONSTR,
- TYPED: TYPED,
- VIEW: VIEW
- };
-
- var _library = false;
-
- var _redefineAll = function (target, src, safe) {
- for (var key in src) _redefine(target, key, src[key], safe);
- return target;
- };
-
- var _anInstance = function (it, Constructor, name, forbiddenField) {
- if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
- throw TypeError(name + ': incorrect invocation!');
- } return it;
- };
-
- // 7.1.4 ToInteger
- var ceil = Math.ceil;
- var floor = Math.floor;
- var _toInteger = function (it) {
- return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
- };
-
- // 7.1.15 ToLength
-
- var min = Math.min;
- var _toLength = function (it) {
- return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
- };
-
- // https://tc39.github.io/ecma262/#sec-toindex
-
-
- var _toIndex = function (it) {
- if (it === undefined) return 0;
- var number = _toInteger(it);
- var length = _toLength(number);
- if (number !== length) throw RangeError('Wrong length!');
- return length;
- };
-
- var toString = {}.toString;
-
- var _cof = function (it) {
- return toString.call(it).slice(8, -1);
- };
-
- // fallback for non-array-like ES3 and non-enumerable old V8 strings
-
- // eslint-disable-next-line no-prototype-builtins
- var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
- return _cof(it) == 'String' ? it.split('') : Object(it);
- };
-
- // 7.2.1 RequireObjectCoercible(argument)
- var _defined = function (it) {
- if (it == undefined) throw TypeError("Can't call method on " + it);
- return it;
- };
-
- // to indexed object, toObject with fallback for non-array-like ES3 strings
-
-
- var _toIobject = function (it) {
- return _iobject(_defined(it));
- };
-
- var max = Math.max;
- var min$1 = Math.min;
- var _toAbsoluteIndex = function (index, length) {
- index = _toInteger(index);
- return index < 0 ? max(index + length, 0) : min$1(index, length);
- };
-
- // false -> Array#indexOf
- // true -> Array#includes
-
-
-
- var _arrayIncludes = function (IS_INCLUDES) {
- return function ($this, el, fromIndex) {
- var O = _toIobject($this);
- var length = _toLength(O.length);
- var index = _toAbsoluteIndex(fromIndex, length);
- var value;
- // Array#includes uses SameValueZero equality algorithm
- // eslint-disable-next-line no-self-compare
- if (IS_INCLUDES && el != el) while (length > index) {
- value = O[index++];
- // eslint-disable-next-line no-self-compare
- if (value != value) return true;
- // Array#indexOf ignores holes, Array#includes - not
- } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
- if (O[index] === el) return IS_INCLUDES || index || 0;
- } return !IS_INCLUDES && -1;
- };
- };
+ // Polyfill for creating CustomEvents on IE9/10/11
+
+ // code pulled from:
+ // https://github.com/d4tocchini/customevent-polyfill
+ // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill
+
+ (function() {
+ if (typeof window === 'undefined') {
+ return;
+ }
+
+ try {
+ var ce = new window.CustomEvent('test', { cancelable: true });
+ ce.preventDefault();
+ if (ce.defaultPrevented !== true) {
+ // IE has problems with .preventDefault() on custom events
+ // http://stackoverflow.com/questions/23349191
+ throw new Error('Could not prevent default');
+ }
+ } catch (e) {
+ var CustomEvent = function(event, params) {
+ var evt, origPrevent;
+ params = params || {
+ bubbles: false,
+ cancelable: false,
+ detail: undefined
+ };
+
+ evt = document.createEvent('CustomEvent');
+ evt.initCustomEvent(
+ event,
+ params.bubbles,
+ params.cancelable,
+ params.detail
+ );
+ origPrevent = evt.preventDefault;
+ evt.preventDefault = function() {
+ origPrevent.call(this);
+ try {
+ Object.defineProperty(this, 'defaultPrevented', {
+ get: function() {
+ return true;
+ }
+ });
+ } catch (e) {
+ this.defaultPrevented = true;
+ }
+ };
+ return evt;
+ };
+
+ CustomEvent.prototype = window.Event.prototype;
+ window.CustomEvent = CustomEvent; // expose definition to window
+ }
+ })();
+
+ var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ (function(global) {
+ /**
+ * Polyfill URLSearchParams
+ *
+ * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js
+ */
+
+ var checkIfIteratorIsSupported = function() {
+ try {
+ return !!Symbol.iterator;
+ } catch (error) {
+ return false;
+ }
+ };
+
+
+ var iteratorSupported = checkIfIteratorIsSupported();
+
+ var createIterator = function(items) {
+ var iterator = {
+ next: function() {
+ var value = items.shift();
+ return { done: value === void 0, value: value };
+ }
+ };
+
+ if (iteratorSupported) {
+ iterator[Symbol.iterator] = function() {
+ return iterator;
+ };
+ }
+
+ return iterator;
+ };
+
+ /**
+ * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing
+ * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.
+ */
+ var serializeParam = function(value) {
+ return encodeURIComponent(value).replace(/%20/g, '+');
+ };
+
+ var deserializeParam = function(value) {
+ return decodeURIComponent(value).replace(/\+/g, ' ');
+ };
+
+ var polyfillURLSearchParams = function() {
+
+ var URLSearchParams = function(searchString) {
+ Object.defineProperty(this, '_entries', { writable: true, value: {} });
+
+ if (typeof searchString === 'string') {
+ if (searchString !== '') {
+ this._fromString(searchString);
+ }
+ } else if (searchString instanceof URLSearchParams) {
+ var _this = this;
+ searchString.forEach(function(value, name) {
+ _this.append(name, value);
+ });
+ }
+ };
+
+ var proto = URLSearchParams.prototype;
+
+ proto.append = function(name, value) {
+ if (name in this._entries) {
+ this._entries[name].push(value.toString());
+ } else {
+ this._entries[name] = [value.toString()];
+ }
+ };
+
+ proto.delete = function(name) {
+ delete this._entries[name];
+ };
+
+ proto.get = function(name) {
+ return (name in this._entries) ? this._entries[name][0] : null;
+ };
+
+ proto.getAll = function(name) {
+ return (name in this._entries) ? this._entries[name].slice(0) : [];
+ };
+
+ proto.has = function(name) {
+ return (name in this._entries);
+ };
+
+ proto.set = function(name, value) {
+ this._entries[name] = [value.toString()];
+ };
+
+ proto.forEach = function(callback, thisArg) {
+ var entries;
+ for (var name in this._entries) {
+ if (this._entries.hasOwnProperty(name)) {
+ entries = this._entries[name];
+ for (var i = 0; i < entries.length; i++) {
+ callback.call(thisArg, entries[i], name, this);
+ }
+ }
+ }
+ };
+
+ proto.keys = function() {
+ var items = [];
+ this.forEach(function(value, name) {
+ items.push(name);
+ });
+ return createIterator(items);
+ };
+
+ proto.values = function() {
+ var items = [];
+ this.forEach(function(value) {
+ items.push(value);
+ });
+ return createIterator(items);
+ };
+
+ proto.entries = function() {
+ var items = [];
+ this.forEach(function(value, name) {
+ items.push([name, value]);
+ });
+ return createIterator(items);
+ };
+
+ if (iteratorSupported) {
+ proto[Symbol.iterator] = proto.entries;
+ }
+
+ proto.toString = function() {
+ var searchArray = [];
+ this.forEach(function(value, name) {
+ searchArray.push(serializeParam(name) + '=' + serializeParam(value));
+ });
+ return searchArray.join('&');
+ };
+
+ Object.defineProperty(proto, '_fromString', {
+ enumerable: false,
+ configurable: false,
+ writable: false,
+ value: function(searchString) {
+ this._entries = {};
+ searchString = searchString.replace(/^\?/, '');
+ var attributes = searchString.split('&');
+ var attribute;
+ for (var i = 0; i < attributes.length; i++) {
+ attribute = attributes[i].split('=');
+ this.append(
+ deserializeParam(attribute[0]),
+ (attribute.length > 1) ? deserializeParam(attribute[1]) : ''
+ );
+ }
+ }
+ });
+
+ global.URLSearchParams = URLSearchParams;
+ };
+
+ if (!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {
+ polyfillURLSearchParams();
+ }
+
+ if (typeof URLSearchParams.prototype.sort !== 'function') {
+ URLSearchParams.prototype.sort = function() {
+ var _this = this;
+ var items = [];
+ this.forEach(function(value, name) {
+ items.push([name, value]);
+ if (!_this._entries) {
+ _this.delete(name);
+ }
+ });
+ items.sort(function(a, b) {
+ if (a[0] < b[0]) {
+ return -1;
+ } else if (a[0] > b[0]) {
+ return +1;
+ } else {
+ return 0;
+ }
+ });
+ if (_this._entries) { // force reset because IE keeps keys index
+ _this._entries = {};
+ }
+ for (var i = 0; i < items.length; i++) {
+ this.append(items[i][0], items[i][1]);
+ }
+ };
+ }
+
+ // HTMLAnchorElement
+
+ })(
+ (typeof commonjsGlobal !== 'undefined') ? commonjsGlobal
+ : ((typeof window !== 'undefined') ? window
+ : ((typeof self !== 'undefined') ? self : commonjsGlobal))
+ );
+
+ (function(global) {
+ /**
+ * Polyfill URL
+ *
+ * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js
+ */
+
+ var checkIfURLIsSupported = function() {
+ try {
+ var u = new URL('b', 'http://a');
+ u.pathname = 'c%20d';
+ return (u.href === 'http://a/c%20d') && u.searchParams;
+ } catch (e) {
+ return false;
+ }
+ };
+
+
+ var polyfillURL = function() {
+ var _URL = global.URL;
+
+ var URL = function(url, base) {
+ if (typeof url !== 'string') url = String(url);
+
+ // Only create another document if the base is different from current location.
+ var doc = document, baseElement;
+ if (base && (global.location === void 0 || base !== global.location.href)) {
+ doc = document.implementation.createHTMLDocument('');
+ baseElement = doc.createElement('base');
+ baseElement.href = base;
+ doc.head.appendChild(baseElement);
+ try {
+ if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);
+ } catch (err) {
+ throw new Error('URL unable to set base ' + base + ' due to ' + err);
+ }
+ }
+
+ var anchorElement = doc.createElement('a');
+ anchorElement.href = url;
+ if (baseElement) {
+ doc.body.appendChild(anchorElement);
+ anchorElement.href = anchorElement.href; // force href to refresh
+ }
+
+ if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {
+ throw new TypeError('Invalid URL');
+ }
+
+ Object.defineProperty(this, '_anchorElement', {
+ value: anchorElement
+ });
+
+
+ // create a linked searchParams which reflect its changes on URL
+ var searchParams = new URLSearchParams(this.search);
+ var enableSearchUpdate = true;
+ var enableSearchParamsUpdate = true;
+ var _this = this;
+ ['append', 'delete', 'set'].forEach(function(methodName) {
+ var method = searchParams[methodName];
+ searchParams[methodName] = function() {
+ method.apply(searchParams, arguments);
+ if (enableSearchUpdate) {
+ enableSearchParamsUpdate = false;
+ _this.search = searchParams.toString();
+ enableSearchParamsUpdate = true;
+ }
+ };
+ });
+
+ Object.defineProperty(this, 'searchParams', {
+ value: searchParams,
+ enumerable: true
+ });
+
+ var search = void 0;
+ Object.defineProperty(this, '_updateSearchParams', {
+ enumerable: false,
+ configurable: false,
+ writable: false,
+ value: function() {
+ if (this.search !== search) {
+ search = this.search;
+ if (enableSearchParamsUpdate) {
+ enableSearchUpdate = false;
+ this.searchParams._fromString(this.search);
+ enableSearchUpdate = true;
+ }
+ }
+ }
+ });
+ };
+
+ var proto = URL.prototype;
+
+ var linkURLWithAnchorAttribute = function(attributeName) {
+ Object.defineProperty(proto, attributeName, {
+ get: function() {
+ return this._anchorElement[attributeName];
+ },
+ set: function(value) {
+ this._anchorElement[attributeName] = value;
+ },
+ enumerable: true
+ });
+ };
+
+ ['hash', 'host', 'hostname', 'port', 'protocol']
+ .forEach(function(attributeName) {
+ linkURLWithAnchorAttribute(attributeName);
+ });
+
+ Object.defineProperty(proto, 'search', {
+ get: function() {
+ return this._anchorElement['search'];
+ },
+ set: function(value) {
+ this._anchorElement['search'] = value;
+ this._updateSearchParams();
+ },
+ enumerable: true
+ });
+
+ Object.defineProperties(proto, {
+
+ 'toString': {
+ get: function() {
+ var _this = this;
+ return function() {
+ return _this.href;
+ };
+ }
+ },
+
+ 'href': {
+ get: function() {
+ return this._anchorElement.href.replace(/\?$/, '');
+ },
+ set: function(value) {
+ this._anchorElement.href = value;
+ this._updateSearchParams();
+ },
+ enumerable: true
+ },
+
+ 'pathname': {
+ get: function() {
+ return this._anchorElement.pathname.replace(/(^\/?)/, '/');
+ },
+ set: function(value) {
+ this._anchorElement.pathname = value;
+ },
+ enumerable: true
+ },
+
+ 'origin': {
+ get: function() {
+ // get expected port from protocol
+ var expectedPort = { 'http:': 80, 'https:': 443, 'ftp:': 21 }[this._anchorElement.protocol];
+ // add port to origin if, expected port is different than actual port
+ // and it is not empty f.e http://foo:8080
+ // 8080 != 80 && 8080 != ''
+ var addPortToOrigin = this._anchorElement.port != expectedPort &&
+ this._anchorElement.port !== '';
+
+ return this._anchorElement.protocol +
+ '//' +
+ this._anchorElement.hostname +
+ (addPortToOrigin ? (':' + this._anchorElement.port) : '');
+ },
+ enumerable: true
+ },
+
+ 'password': { // TODO
+ get: function() {
+ return '';
+ },
+ set: function(value) {
+ },
+ enumerable: true
+ },
+
+ 'username': { // TODO
+ get: function() {
+ return '';
+ },
+ set: function(value) {
+ },
+ enumerable: true
+ },
+ });
+
+ URL.createObjectURL = function(blob) {
+ return _URL.createObjectURL.apply(_URL, arguments);
+ };
+
+ URL.revokeObjectURL = function(url) {
+ return _URL.revokeObjectURL.apply(_URL, arguments);
+ };
+
+ global.URL = URL;
+
+ };
+
+ if (!checkIfURLIsSupported()) {
+ polyfillURL();
+ }
+
+ if ((global.location !== void 0) && !('origin' in global.location)) {
+ var getOrigin = function() {
+ return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');
+ };
+
+ try {
+ Object.defineProperty(global.location, 'origin', {
+ get: getOrigin,
+ enumerable: true
+ });
+ } catch (e) {
+ setInterval(function() {
+ global.location.origin = getOrigin();
+ }, 100);
+ }
+ }
+
+ })(
+ (typeof commonjsGlobal !== 'undefined') ? commonjsGlobal
+ : ((typeof window !== 'undefined') ? window
+ : ((typeof self !== 'undefined') ? self : commonjsGlobal))
+ );
+
+ var _aFunction = function (it) {
+ if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+ return it;
+ };
+
+ // optional / simple context binding
+
+ var _ctx = function (fn, that, length) {
+ _aFunction(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+ };
+
+ var _global = createCommonjsModule(function (module) {
+ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+ var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
+ // eslint-disable-next-line no-new-func
+ : Function('return this')();
+ if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+ });
+
+ var _core = createCommonjsModule(function (module) {
+ var core = module.exports = { version: '2.5.7' };
+ if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+ });
+ var _core_1 = _core.version;
+
+ var _isObject = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+ };
+
+ var _anObject = function (it) {
+ if (!_isObject(it)) throw TypeError(it + ' is not an object!');
+ return it;
+ };
+
+ var _fails = function (exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return true;
+ }
+ };
+
+ // Thank's IE8 for his funny defineProperty
+ var _descriptors = !_fails(function () {
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+ });
+
+ var document$1 = _global.document;
+ // typeof document.createElement is 'object' in old IE
+ var is = _isObject(document$1) && _isObject(document$1.createElement);
+ var _domCreate = function (it) {
+ return is ? document$1.createElement(it) : {};
+ };
+
+ var _ie8DomDefine = !_descriptors && !_fails(function () {
+ return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
+ });
+
+ // 7.1.1 ToPrimitive(input [, PreferredType])
+
+ // instead of the ES6 spec version, we didn't implement @@toPrimitive case
+ // and the second argument - flag - preferred type is a string
+ var _toPrimitive = function (it, S) {
+ if (!_isObject(it)) return it;
+ var fn, val;
+ if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
+ if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;
+ if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+ };
+
+ var dP = Object.defineProperty;
+
+ var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ _anObject(O);
+ P = _toPrimitive(P, true);
+ _anObject(Attributes);
+ if (_ie8DomDefine) try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+ };
+
+ var _objectDp = {
+ f: f
+ };
+
+ var _propertyDesc = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+ };
+
+ var _hide = _descriptors ? function (object, key, value) {
+ return _objectDp.f(object, key, _propertyDesc(1, value));
+ } : function (object, key, value) {
+ object[key] = value;
+ return object;
+ };
+
+ var hasOwnProperty = {}.hasOwnProperty;
+ var _has = function (it, key) {
+ return hasOwnProperty.call(it, key);
+ };
+
+ var id = 0;
+ var px = Math.random();
+ var _uid = function (key) {
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+ };
+
+ var _redefine = createCommonjsModule(function (module) {
+ var SRC = _uid('src');
+ var TO_STRING = 'toString';
+ var $toString = Function[TO_STRING];
+ var TPL = ('' + $toString).split(TO_STRING);
+
+ _core.inspectSource = function (it) {
+ return $toString.call(it);
+ };
+
+ (module.exports = function (O, key, val, safe) {
+ var isFunction = typeof val == 'function';
+ if (isFunction) _has(val, 'name') || _hide(val, 'name', key);
+ if (O[key] === val) return;
+ if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
+ if (O === _global) {
+ O[key] = val;
+ } else if (!safe) {
+ delete O[key];
+ _hide(O, key, val);
+ } else if (O[key]) {
+ O[key] = val;
+ } else {
+ _hide(O, key, val);
+ }
+ // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
+ })(Function.prototype, TO_STRING, function toString() {
+ return typeof this == 'function' && this[SRC] || $toString.call(this);
+ });
+ });
+
+ var PROTOTYPE = 'prototype';
+
+ var $export = function (type, name, source) {
+ var IS_FORCED = type & $export.F;
+ var IS_GLOBAL = type & $export.G;
+ var IS_STATIC = type & $export.S;
+ var IS_PROTO = type & $export.P;
+ var IS_BIND = type & $export.B;
+ var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];
+ var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
+ var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
+ var key, own, out, exp;
+ if (IS_GLOBAL) source = name;
+ for (key in source) {
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ // export native or passed
+ out = (own ? target : source)[key];
+ // bind timers to global for call from export context
+ exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
+ // extend global
+ if (target) _redefine(target, key, out, type & $export.U);
+ // export
+ if (exports[key] != out) _hide(exports, key, exp);
+ if (IS_PROTO && expProto[key] != out) expProto[key] = out;
+ }
+ };
+ _global.core = _core;
+ // type bitmap
+ $export.F = 1; // forced
+ $export.G = 2; // global
+ $export.S = 4; // static
+ $export.P = 8; // proto
+ $export.B = 16; // bind
+ $export.W = 32; // wrap
+ $export.U = 64; // safe
+ $export.R = 128; // real proto method for `library`
+ var _export = $export;
+
+ // 7.2.1 RequireObjectCoercible(argument)
+ var _defined = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+ };
+
+ // 7.1.13 ToObject(argument)
+
+ var _toObject = function (it) {
+ return Object(_defined(it));
+ };
+
+ // call something on iterator step with safe closing on error
+
+ var _iterCall = function (iterator, fn, value, entries) {
+ try {
+ return entries ? fn(_anObject(value)[0], value[1]) : fn(value);
+ // 7.4.6 IteratorClose(iterator, completion)
+ } catch (e) {
+ var ret = iterator['return'];
+ if (ret !== undefined) _anObject(ret.call(iterator));
+ throw e;
+ }
+ };
+
+ var _iterators = {};
+
+ var _library = false;
+
+ var _shared = createCommonjsModule(function (module) {
+ var SHARED = '__core-js_shared__';
+ var store = _global[SHARED] || (_global[SHARED] = {});
+
+ (module.exports = function (key, value) {
+ return store[key] || (store[key] = value !== undefined ? value : {});
+ })('versions', []).push({
+ version: _core.version,
+ mode: 'global',
+ copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+ });
+ });
+
+ var _wks = createCommonjsModule(function (module) {
+ var store = _shared('wks');
+
+ var Symbol = _global.Symbol;
+ var USE_SYMBOL = typeof Symbol == 'function';
+
+ var $exports = module.exports = function (name) {
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));
+ };
+
+ $exports.store = store;
+ });
+
+ // check on default Array iterator
+
+ var ITERATOR = _wks('iterator');
+ var ArrayProto = Array.prototype;
+
+ var _isArrayIter = function (it) {
+ return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR] === it);
+ };
+
+ // 7.1.4 ToInteger
+ var ceil = Math.ceil;
+ var floor = Math.floor;
+ var _toInteger = function (it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+ };
+
+ // 7.1.15 ToLength
+
+ var min = Math.min;
+ var _toLength = function (it) {
+ return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+ };
+
+ var _createProperty = function (object, index, value) {
+ if (index in object) _objectDp.f(object, index, _propertyDesc(0, value));
+ else object[index] = value;
+ };
+
+ var toString = {}.toString;
+
+ var _cof = function (it) {
+ return toString.call(it).slice(8, -1);
+ };
+
+ // getting tag from 19.1.3.6 Object.prototype.toString()
+
+ var TAG = _wks('toStringTag');
+ // ES3 wrong here
+ var ARG = _cof(function () { return arguments; }()) == 'Arguments';
+
+ // fallback for IE11 Script Access Denied error
+ var tryGet = function (it, key) {
+ try {
+ return it[key];
+ } catch (e) { /* empty */ }
+ };
+
+ var _classof = function (it) {
+ var O, T, B;
+ return it === undefined ? 'Undefined' : it === null ? 'Null'
+ // @@toStringTag case
+ : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
+ // builtinTag case
+ : ARG ? _cof(O)
+ // ES3 arguments fallback
+ : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
+ };
+
+ var ITERATOR$1 = _wks('iterator');
+
+ var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
+ if (it != undefined) return it[ITERATOR$1]
+ || it['@@iterator']
+ || _iterators[_classof(it)];
+ };
+
+ var ITERATOR$2 = _wks('iterator');
+ var SAFE_CLOSING = false;
+
+ try {
+ var riter = [7][ITERATOR$2]();
+ riter['return'] = function () { SAFE_CLOSING = true; };
+ } catch (e) { /* empty */ }
+
+ var _iterDetect = function (exec, skipClosing) {
+ if (!skipClosing && !SAFE_CLOSING) return false;
+ var safe = false;
+ try {
+ var arr = [7];
+ var iter = arr[ITERATOR$2]();
+ iter.next = function () { return { done: safe = true }; };
+ arr[ITERATOR$2] = function () { return iter; };
+ exec(arr);
+ } catch (e) { /* empty */ }
+ return safe;
+ };
+
+ _export(_export.S + _export.F * !_iterDetect(function (iter) { }), 'Array', {
+ // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
+ from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
+ var O = _toObject(arrayLike);
+ var C = typeof this == 'function' ? this : Array;
+ var aLen = arguments.length;
+ var mapfn = aLen > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ var index = 0;
+ var iterFn = core_getIteratorMethod(O);
+ var length, result, step, iterator;
+ if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
+ // if object isn't iterable or it's array with default iterator - use simple case
+ if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) {
+ for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
+ _createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value);
+ }
+ } else {
+ length = _toLength(O.length);
+ for (result = new C(length); length > index; index++) {
+ _createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
+ }
+ }
+ result.length = index;
+ return result;
+ }
+ });
+
+ // fallback for non-array-like ES3 and non-enumerable old V8 strings
+
+ // eslint-disable-next-line no-prototype-builtins
+ var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+ return _cof(it) == 'String' ? it.split('') : Object(it);
+ };
+
+ // 7.2.2 IsArray(argument)
+
+ var _isArray = Array.isArray || function isArray(arg) {
+ return _cof(arg) == 'Array';
+ };
+
+ var SPECIES = _wks('species');
+
+ var _arraySpeciesConstructor = function (original) {
+ var C;
+ if (_isArray(original)) {
+ C = original.constructor;
+ // cross-realm fallback
+ if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined;
+ if (_isObject(C)) {
+ C = C[SPECIES];
+ if (C === null) C = undefined;
+ }
+ } return C === undefined ? Array : C;
+ };
+
+ // 9.4.2.3 ArraySpeciesCreate(originalArray, length)
+
+
+ var _arraySpeciesCreate = function (original, length) {
+ return new (_arraySpeciesConstructor(original))(length);
+ };
+
+ // 0 -> Array#forEach
+ // 1 -> Array#map
+ // 2 -> Array#filter
+ // 3 -> Array#some
+ // 4 -> Array#every
+ // 5 -> Array#find
+ // 6 -> Array#findIndex
+
+
+
+
+
+ var _arrayMethods = function (TYPE, $create) {
+ var IS_MAP = TYPE == 1;
+ var IS_FILTER = TYPE == 2;
+ var IS_SOME = TYPE == 3;
+ var IS_EVERY = TYPE == 4;
+ var IS_FIND_INDEX = TYPE == 6;
+ var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
+ var create = $create || _arraySpeciesCreate;
+ return function ($this, callbackfn, that) {
+ var O = _toObject($this);
+ var self = _iobject(O);
+ var f = _ctx(callbackfn, that, 3);
+ var length = _toLength(self.length);
+ var index = 0;
+ var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
+ var val, res;
+ for (;length > index; index++) if (NO_HOLES || index in self) {
+ val = self[index];
+ res = f(val, index, O);
+ if (TYPE) {
+ if (IS_MAP) result[index] = res; // map
+ else if (res) switch (TYPE) {
+ case 3: return true; // some
+ case 5: return val; // find
+ case 6: return index; // findIndex
+ case 2: result.push(val); // filter
+ } else if (IS_EVERY) return false; // every
+ }
+ }
+ return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
+ };
+ };
+
+ // 22.1.3.31 Array.prototype[@@unscopables]
+ var UNSCOPABLES = _wks('unscopables');
+ var ArrayProto$1 = Array.prototype;
+ if (ArrayProto$1[UNSCOPABLES] == undefined) _hide(ArrayProto$1, UNSCOPABLES, {});
+ var _addToUnscopables = function (key) {
+ ArrayProto$1[UNSCOPABLES][key] = true;
+ };
+
+ // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)
+
+ var $find = _arrayMethods(5);
+ var KEY = 'find';
+ var forced = true;
+ // Shouldn't skip holes
+ if (KEY in []) Array(1)[KEY](function () { forced = false; });
+ _export(_export.P + _export.F * forced, 'Array', {
+ find: function find(callbackfn /* , that = undefined */) {
+ return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+ _addToUnscopables(KEY);
+
+ var f$1 = {}.propertyIsEnumerable;
+
+ var _objectPie = {
+ f: f$1
+ };
+
+ // to indexed object, toObject with fallback for non-array-like ES3 strings
+
+
+ var _toIobject = function (it) {
+ return _iobject(_defined(it));
+ };
+
+ var gOPD = Object.getOwnPropertyDescriptor;
+
+ var f$2 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) {
+ O = _toIobject(O);
+ P = _toPrimitive(P, true);
+ if (_ie8DomDefine) try {
+ return gOPD(O, P);
+ } catch (e) { /* empty */ }
+ if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]);
+ };
+
+ var _objectGopd = {
+ f: f$2
+ };
+
+ // Works with __proto__ only. Old v8 can't work with null proto objects.
+ /* eslint-disable no-proto */
+
+
+ var check = function (O, proto) {
+ _anObject(O);
+ if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
+ };
+ var _setProto = {
+ set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
+ function (test, buggy, set) {
+ try {
+ set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);
+ set(test, []);
+ buggy = !(test instanceof Array);
+ } catch (e) { buggy = true; }
+ return function setPrototypeOf(O, proto) {
+ check(O, proto);
+ if (buggy) O.__proto__ = proto;
+ else set(O, proto);
+ return O;
+ };
+ }({}, false) : undefined),
+ check: check
+ };
+
+ var setPrototypeOf = _setProto.set;
+ var _inheritIfRequired = function (that, target, C) {
+ var S = target.constructor;
+ var P;
+ if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) {
+ setPrototypeOf(that, P);
+ } return that;
+ };
+
+ var max = Math.max;
+ var min$1 = Math.min;
+ var _toAbsoluteIndex = function (index, length) {
+ index = _toInteger(index);
+ return index < 0 ? max(index + length, 0) : min$1(index, length);
+ };
+
+ // false -> Array#indexOf
+ // true -> Array#includes
+
+
+
+ var _arrayIncludes = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = _toIobject($this);
+ var length = _toLength(O.length);
+ var index = _toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+ if (O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+ };
+
+ var shared = _shared('keys');
+
+ var _sharedKey = function (key) {
+ return shared[key] || (shared[key] = _uid(key));
+ };
+
+ var arrayIndexOf = _arrayIncludes(false);
+ var IE_PROTO = _sharedKey('IE_PROTO');
+
+ var _objectKeysInternal = function (object, names) {
+ var O = _toIobject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (_has(O, key = names[i++])) {
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+ };
+
+ // IE 8- don't enum bug keys
+ var _enumBugKeys = (
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+ ).split(',');
+
+ // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+
+ var hiddenKeys = _enumBugKeys.concat('length', 'prototype');
+
+ var f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return _objectKeysInternal(O, hiddenKeys);
+ };
+
+ var _objectGopn = {
+ f: f$3
+ };
+
+ var _stringWs = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' +
+ '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
+
+ var space = '[' + _stringWs + ']';
+ var non = '\u200b\u0085';
+ var ltrim = RegExp('^' + space + space + '*');
+ var rtrim = RegExp(space + space + '*$');
+
+ var exporter = function (KEY, exec, ALIAS) {
+ var exp = {};
+ var FORCE = _fails(function () {
+ return !!_stringWs[KEY]() || non[KEY]() != non;
+ });
+ var fn = exp[KEY] = FORCE ? exec(trim) : _stringWs[KEY];
+ if (ALIAS) exp[ALIAS] = fn;
+ _export(_export.P + _export.F * FORCE, 'String', exp);
+ };
+
+ // 1 -> String#trimLeft
+ // 2 -> String#trimRight
+ // 3 -> String#trim
+ var trim = exporter.trim = function (string, TYPE) {
+ string = String(_defined(string));
+ if (TYPE & 1) string = string.replace(ltrim, '');
+ if (TYPE & 2) string = string.replace(rtrim, '');
+ return string;
+ };
+
+ var _stringTrim = exporter;
+
+ // 19.1.2.14 / 15.2.3.14 Object.keys(O)
+
+
+
+ var _objectKeys = Object.keys || function keys(O) {
+ return _objectKeysInternal(O, _enumBugKeys);
+ };
+
+ var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
+ _anObject(O);
+ var keys = _objectKeys(Properties);
+ var length = keys.length;
+ var i = 0;
+ var P;
+ while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]);
+ return O;
+ };
+
+ var document$2 = _global.document;
+ var _html = document$2 && document$2.documentElement;
+
+ // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+
+
+
+ var IE_PROTO$1 = _sharedKey('IE_PROTO');
+ var Empty = function () { /* empty */ };
+ var PROTOTYPE$1 = 'prototype';
+
+ // Create object with fake `null` prototype: use iframe Object with cleared prototype
+ var createDict = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = _domCreate('iframe');
+ var i = _enumBugKeys.length;
+ var lt = '<';
+ var gt = '>';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ _html.appendChild(iframe);
+ iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+ // createDict = iframe.contentWindow.Object;
+ // html.removeChild(iframe);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+ iframeDocument.close();
+ createDict = iframeDocument.F;
+ while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]];
+ return createDict();
+ };
+
+ var _objectCreate = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ Empty[PROTOTYPE$1] = _anObject(O);
+ result = new Empty();
+ Empty[PROTOTYPE$1] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO$1] = O;
+ } else result = createDict();
+ return Properties === undefined ? result : _objectDps(result, Properties);
+ };
+
+ var gOPN = _objectGopn.f;
+ var gOPD$1 = _objectGopd.f;
+ var dP$1 = _objectDp.f;
+ var $trim = _stringTrim.trim;
+ var NUMBER = 'Number';
+ var $Number = _global[NUMBER];
+ var Base = $Number;
+ var proto = $Number.prototype;
+ // Opera ~12 has broken Object#toString
+ var BROKEN_COF = _cof(_objectCreate(proto)) == NUMBER;
+ var TRIM = 'trim' in String.prototype;
+
+ // 7.1.3 ToNumber(argument)
+ var toNumber = function (argument) {
+ var it = _toPrimitive(argument, false);
+ if (typeof it == 'string' && it.length > 2) {
+ it = TRIM ? it.trim() : $trim(it, 3);
+ var first = it.charCodeAt(0);
+ var third, radix, maxCode;
+ if (first === 43 || first === 45) {
+ third = it.charCodeAt(2);
+ if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
+ } else if (first === 48) {
+ switch (it.charCodeAt(1)) {
+ case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i
+ case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i
+ default: return +it;
+ }
+ for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {
+ code = digits.charCodeAt(i);
+ // parseInt parses a string to a first unavailable symbol
+ // but ToNumber should return NaN if a string contains unavailable symbols
+ if (code < 48 || code > maxCode) return NaN;
+ } return parseInt(digits, radix);
+ }
+ } return +it;
+ };
+
+ if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {
+ $Number = function Number(value) {
+ var it = arguments.length < 1 ? 0 : value;
+ var that = this;
+ return that instanceof $Number
+ // check on 1..constructor(foo) case
+ && (BROKEN_COF ? _fails(function () { proto.valueOf.call(that); }) : _cof(that) != NUMBER)
+ ? _inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);
+ };
+ for (var keys = _descriptors ? gOPN(Base) : (
+ // ES3:
+ 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
+ // ES6 (in case, if modules with ES6 Number statics required before):
+ 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +
+ 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'
+ ).split(','), j = 0, key; keys.length > j; j++) {
+ if (_has(Base, key = keys[j]) && !_has($Number, key)) {
+ dP$1($Number, key, gOPD$1(Base, key));
+ }
+ }
+ $Number.prototype = proto;
+ proto.constructor = $Number;
+ _redefine(_global, NUMBER, $Number);
+ }
+
+ // most Object methods by ES6 should accept primitives
+
+
+
+ var _objectSap = function (KEY, exec) {
+ var fn = (_core.Object || {})[KEY] || Object[KEY];
+ var exp = {};
+ exp[KEY] = exec(fn);
+ _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp);
+ };
+
+ // 19.1.2.14 Object.keys(O)
+
+
+
+ _objectSap('keys', function () {
+ return function keys(it) {
+ return _objectKeys(_toObject(it));
+ };
+ });
+
+ // 7.2.8 IsRegExp(argument)
+
+
+ var MATCH = _wks('match');
+ var _isRegexp = function (it) {
+ var isRegExp;
+ return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp');
+ };
+
+ // helper for String#{startsWith, endsWith, includes}
+
+
+
+ var _stringContext = function (that, searchString, NAME) {
+ if (_isRegexp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
+ return String(_defined(that));
+ };
+
+ var MATCH$1 = _wks('match');
+ var _failsIsRegexp = function (KEY) {
+ var re = /./;
+ try {
+ '/./'[KEY](re);
+ } catch (e) {
+ try {
+ re[MATCH$1] = false;
+ return !'/./'[KEY](re);
+ } catch (f) { /* empty */ }
+ } return true;
+ };
+
+ var INCLUDES = 'includes';
+
+ _export(_export.P + _export.F * _failsIsRegexp(INCLUDES), 'String', {
+ includes: function includes(searchString /* , position = 0 */) {
+ return !!~_stringContext(this, searchString, INCLUDES)
+ .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ // https://github.com/tc39/Array.prototype.includes
+
+ var $includes = _arrayIncludes(true);
+
+ _export(_export.P, 'Array', {
+ includes: function includes(el /* , fromIndex = 0 */) {
+ return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ _addToUnscopables('includes');
+
+ var _fixReWks = function (KEY, length, exec) {
+ var SYMBOL = _wks(KEY);
+ var fns = exec(_defined, SYMBOL, ''[KEY]);
+ var strfn = fns[0];
+ var rxfn = fns[1];
+ if (_fails(function () {
+ var O = {};
+ O[SYMBOL] = function () { return 7; };
+ return ''[KEY](O) != 7;
+ })) {
+ _redefine(String.prototype, KEY, strfn);
+ _hide(RegExp.prototype, SYMBOL, length == 2
+ // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
+ // 21.2.5.11 RegExp.prototype[@@split](string, limit)
+ ? function (string, arg) { return rxfn.call(string, this, arg); }
+ // 21.2.5.6 RegExp.prototype[@@match](string)
+ // 21.2.5.9 RegExp.prototype[@@search](string)
+ : function (string) { return rxfn.call(string, this); }
+ );
+ }
+ };
+
+ // @@search logic
+ _fixReWks('search', 1, function (defined, SEARCH, $search) {
+ // 21.1.3.15 String.prototype.search(regexp)
+ return [function search(regexp) {
+ var O = defined(this);
+ var fn = regexp == undefined ? undefined : regexp[SEARCH];
+ return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
+ }, $search];
+ });
+
+ // 21.2.5.3 get RegExp.prototype.flags
+
+ var _flags = function () {
+ var that = _anObject(this);
+ var result = '';
+ if (that.global) result += 'g';
+ if (that.ignoreCase) result += 'i';
+ if (that.multiline) result += 'm';
+ if (that.unicode) result += 'u';
+ if (that.sticky) result += 'y';
+ return result;
+ };
+
+ // 21.2.5.3 get RegExp.prototype.flags()
+ if (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', {
+ configurable: true,
+ get: _flags
+ });
+
+ var TO_STRING = 'toString';
+ var $toString = /./[TO_STRING];
+
+ var define = function (fn) {
+ _redefine(RegExp.prototype, TO_STRING, fn, true);
+ };
+
+ // 21.2.5.14 RegExp.prototype.toString()
+ if (_fails(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {
+ define(function toString() {
+ var R = _anObject(this);
+ return '/'.concat(R.source, '/',
+ 'flags' in R ? R.flags : !_descriptors && R instanceof RegExp ? _flags.call(R) : undefined);
+ });
+ // FF44- RegExp#toString has a wrong name
+ } else if ($toString.name != TO_STRING) {
+ define(function toString() {
+ return $toString.call(this);
+ });
+ }
+
+ var _iterStep = function (done, value) {
+ return { value: value, done: !!done };
+ };
+
+ var def = _objectDp.f;
+
+ var TAG$1 = _wks('toStringTag');
+
+ var _setToStringTag = function (it, tag, stat) {
+ if (it && !_has(it = stat ? it : it.prototype, TAG$1)) def(it, TAG$1, { configurable: true, value: tag });
+ };
+
+ var IteratorPrototype = {};
+
+ // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+ _hide(IteratorPrototype, _wks('iterator'), function () { return this; });
+
+ var _iterCreate = function (Constructor, NAME, next) {
+ Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) });
+ _setToStringTag(Constructor, NAME + ' Iterator');
+ };
+
+ // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+
+
+ var IE_PROTO$2 = _sharedKey('IE_PROTO');
+ var ObjectProto = Object.prototype;
+
+ var _objectGpo = Object.getPrototypeOf || function (O) {
+ O = _toObject(O);
+ if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2];
+ if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+ return O.constructor.prototype;
+ } return O instanceof Object ? ObjectProto : null;
+ };
+
+ var ITERATOR$3 = _wks('iterator');
+ var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+ var FF_ITERATOR = '@@iterator';
+ var KEYS = 'keys';
+ var VALUES = 'values';
+
+ var returnThis = function () { return this; };
+
+ var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+ _iterCreate(Constructor, NAME, next);
+ var getMethod = function (kind) {
+ if (!BUGGY && kind in proto) return proto[kind];
+ switch (kind) {
+ case KEYS: return function keys() { return new Constructor(this, kind); };
+ case VALUES: return function values() { return new Constructor(this, kind); };
+ } return function entries() { return new Constructor(this, kind); };
+ };
+ var TAG = NAME + ' Iterator';
+ var DEF_VALUES = DEFAULT == VALUES;
+ var VALUES_BUG = false;
+ var proto = Base.prototype;
+ var $native = proto[ITERATOR$3] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+ var $default = $native || getMethod(DEFAULT);
+ var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+ var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+ var methods, key, IteratorPrototype;
+ // Fix native
+ if ($anyNative) {
+ IteratorPrototype = _objectGpo($anyNative.call(new Base()));
+ if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+ // Set @@toStringTag to native iterators
+ _setToStringTag(IteratorPrototype, TAG, true);
+ // fix for some old engines
+ if (typeof IteratorPrototype[ITERATOR$3] != 'function') _hide(IteratorPrototype, ITERATOR$3, returnThis);
+ }
+ }
+ // fix Array#{values, @@iterator}.name in V8 / FF
+ if (DEF_VALUES && $native && $native.name !== VALUES) {
+ VALUES_BUG = true;
+ $default = function values() { return $native.call(this); };
+ }
+ // Define iterator
+ if (BUGGY || VALUES_BUG || !proto[ITERATOR$3]) {
+ _hide(proto, ITERATOR$3, $default);
+ }
+ // Plug for library
+ _iterators[NAME] = $default;
+ _iterators[TAG] = returnThis;
+ if (DEFAULT) {
+ methods = {
+ values: DEF_VALUES ? $default : getMethod(VALUES),
+ keys: IS_SET ? $default : getMethod(KEYS),
+ entries: $entries
+ };
+ if (FORCED) for (key in methods) {
+ if (!(key in proto)) _redefine(proto, key, methods[key]);
+ } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);
+ }
+ return methods;
+ };
+
+ // 22.1.3.4 Array.prototype.entries()
+ // 22.1.3.13 Array.prototype.keys()
+ // 22.1.3.29 Array.prototype.values()
+ // 22.1.3.30 Array.prototype[@@iterator]()
+ var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {
+ this._t = _toIobject(iterated); // target
+ this._i = 0; // next index
+ this._k = kind; // kind
+ // 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+ }, function () {
+ var O = this._t;
+ var kind = this._k;
+ var index = this._i++;
+ if (!O || index >= O.length) {
+ this._t = undefined;
+ return _iterStep(1);
+ }
+ if (kind == 'keys') return _iterStep(0, index);
+ if (kind == 'values') return _iterStep(0, O[index]);
+ return _iterStep(0, [index, O[index]]);
+ }, 'values');
+
+ // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+ _iterators.Arguments = _iterators.Array;
+
+ _addToUnscopables('keys');
+ _addToUnscopables('values');
+ _addToUnscopables('entries');
+
+ var ITERATOR$4 = _wks('iterator');
+ var TO_STRING_TAG = _wks('toStringTag');
+ var ArrayValues = _iterators.Array;
+
+ var DOMIterables = {
+ CSSRuleList: true, // TODO: Not spec compliant, should be false.
+ CSSStyleDeclaration: false,
+ CSSValueList: false,
+ ClientRectList: false,
+ DOMRectList: false,
+ DOMStringList: false,
+ DOMTokenList: true,
+ DataTransferItemList: false,
+ FileList: false,
+ HTMLAllCollection: false,
+ HTMLCollection: false,
+ HTMLFormElement: false,
+ HTMLSelectElement: false,
+ MediaList: true, // TODO: Not spec compliant, should be false.
+ MimeTypeArray: false,
+ NamedNodeMap: false,
+ NodeList: true,
+ PaintRequestList: false,
+ Plugin: false,
+ PluginArray: false,
+ SVGLengthList: false,
+ SVGNumberList: false,
+ SVGPathSegList: false,
+ SVGPointList: false,
+ SVGStringList: false,
+ SVGTransformList: false,
+ SourceBufferList: false,
+ StyleSheetList: true, // TODO: Not spec compliant, should be false.
+ TextTrackCueList: false,
+ TextTrackList: false,
+ TouchList: false
+ };
+
+ for (var collections = _objectKeys(DOMIterables), i = 0; i < collections.length; i++) {
+ var NAME = collections[i];
+ var explicit = DOMIterables[NAME];
+ var Collection = _global[NAME];
+ var proto$1 = Collection && Collection.prototype;
+ var key$1;
+ if (proto$1) {
+ if (!proto$1[ITERATOR$4]) _hide(proto$1, ITERATOR$4, ArrayValues);
+ if (!proto$1[TO_STRING_TAG]) _hide(proto$1, TO_STRING_TAG, NAME);
+ _iterators[NAME] = ArrayValues;
+ if (explicit) for (key$1 in es6_array_iterator) if (!proto$1[key$1]) _redefine(proto$1, key$1, es6_array_iterator[key$1], true);
+ }
+ }
+
+ // true -> String#at
+ // false -> String#codePointAt
+ var _stringAt = function (TO_STRING) {
+ return function (that, pos) {
+ var s = String(_defined(that));
+ var i = _toInteger(pos);
+ var l = s.length;
+ var a, b;
+ if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+ a = s.charCodeAt(i);
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+ ? TO_STRING ? s.charAt(i) : a
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+ };
+ };
+
+ var $at = _stringAt(true);
+
+ // 21.1.3.27 String.prototype[@@iterator]()
+ _iterDefine(String, 'String', function (iterated) {
+ this._t = String(iterated); // target
+ this._i = 0; // next index
+ // 21.1.5.2.1 %StringIteratorPrototype%.next()
+ }, function () {
+ var O = this._t;
+ var index = this._i;
+ var point;
+ if (index >= O.length) return { value: undefined, done: true };
+ point = $at(O, index);
+ this._i += point.length;
+ return { value: point, done: false };
+ });
+
+ var _meta = createCommonjsModule(function (module) {
+ var META = _uid('meta');
+
+
+ var setDesc = _objectDp.f;
+ var id = 0;
+ var isExtensible = Object.isExtensible || function () {
+ return true;
+ };
+ var FREEZE = !_fails(function () {
+ return isExtensible(Object.preventExtensions({}));
+ });
+ var setMeta = function (it) {
+ setDesc(it, META, { value: {
+ i: 'O' + ++id, // object ID
+ w: {} // weak collections IDs
+ } });
+ };
+ var fastKey = function (it, create) {
+ // return primitive with prefix
+ if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!_has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMeta(it);
+ // return object ID
+ } return it[META].i;
+ };
+ var getWeak = function (it, create) {
+ if (!_has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMeta(it);
+ // return hash weak collections IDs
+ } return it[META].w;
+ };
+ // add metadata on freeze-family methods calling
+ var onFreeze = function (it) {
+ if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it);
+ return it;
+ };
+ var meta = module.exports = {
+ KEY: META,
+ NEED: false,
+ fastKey: fastKey,
+ getWeak: getWeak,
+ onFreeze: onFreeze
+ };
+ });
+ var _meta_1 = _meta.KEY;
+ var _meta_2 = _meta.NEED;
+ var _meta_3 = _meta.fastKey;
+ var _meta_4 = _meta.getWeak;
+ var _meta_5 = _meta.onFreeze;
+
+ var f$4 = Object.getOwnPropertySymbols;
+
+ var _objectGops = {
+ f: f$4
+ };
+
+ // 19.1.2.1 Object.assign(target, source, ...)
+
+
+
+
+
+ var $assign = Object.assign;
+
+ // should work with symbols and should have deterministic property order (V8 bug)
+ var _objectAssign = !$assign || _fails(function () {
+ var A = {};
+ var B = {};
+ // eslint-disable-next-line no-undef
+ var S = Symbol();
+ var K = 'abcdefghijklmnopqrst';
+ A[S] = 7;
+ K.split('').forEach(function (k) { B[k] = k; });
+ return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
+ }) ? function assign(target, source) { // eslint-disable-line no-unused-vars
+ var T = _toObject(target);
+ var aLen = arguments.length;
+ var index = 1;
+ var getSymbols = _objectGops.f;
+ var isEnum = _objectPie.f;
+ while (aLen > index) {
+ var S = _iobject(arguments[index++]);
+ var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S);
+ var length = keys.length;
+ var j = 0;
+ var key;
+ while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
+ } return T;
+ } : $assign;
+
+ var _redefineAll = function (target, src, safe) {
+ for (var key in src) _redefine(target, key, src[key], safe);
+ return target;
+ };
+
+ var _anInstance = function (it, Constructor, name, forbiddenField) {
+ if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
+ throw TypeError(name + ': incorrect invocation!');
+ } return it;
+ };
+
+ var _forOf = createCommonjsModule(function (module) {
+ var BREAK = {};
+ var RETURN = {};
+ var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
+ var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable);
+ var f = _ctx(fn, that, entries ? 2 : 1);
+ var index = 0;
+ var length, step, iterator, result;
+ if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
+ // fast case for arrays with default iterator
+ if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) {
+ result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
+ if (result === BREAK || result === RETURN) return result;
+ } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
+ result = _iterCall(iterator, f, step.value, entries);
+ if (result === BREAK || result === RETURN) return result;
+ }
+ };
+ exports.BREAK = BREAK;
+ exports.RETURN = RETURN;
+ });
+
+ var _validateCollection = function (it, TYPE) {
+ if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
+ return it;
+ };
+
+ var getWeak = _meta.getWeak;
+
+
+
+
+
+
+
+ var arrayFind = _arrayMethods(5);
+ var arrayFindIndex = _arrayMethods(6);
+ var id$1 = 0;
+
+ // fallback for uncaught frozen keys
+ var uncaughtFrozenStore = function (that) {
+ return that._l || (that._l = new UncaughtFrozenStore());
+ };
+ var UncaughtFrozenStore = function () {
+ this.a = [];
+ };
+ var findUncaughtFrozen = function (store, key) {
+ return arrayFind(store.a, function (it) {
+ return it[0] === key;
+ });
+ };
+ UncaughtFrozenStore.prototype = {
+ get: function (key) {
+ var entry = findUncaughtFrozen(this, key);
+ if (entry) return entry[1];
+ },
+ has: function (key) {
+ return !!findUncaughtFrozen(this, key);
+ },
+ set: function (key, value) {
+ var entry = findUncaughtFrozen(this, key);
+ if (entry) entry[1] = value;
+ else this.a.push([key, value]);
+ },
+ 'delete': function (key) {
+ var index = arrayFindIndex(this.a, function (it) {
+ return it[0] === key;
+ });
+ if (~index) this.a.splice(index, 1);
+ return !!~index;
+ }
+ };
+
+ var _collectionWeak = {
+ getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
+ var C = wrapper(function (that, iterable) {
+ _anInstance(that, C, NAME, '_i');
+ that._t = NAME; // collection type
+ that._i = id$1++; // collection id
+ that._l = undefined; // leak store for uncaught frozen objects
+ if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
+ });
+ _redefineAll(C.prototype, {
+ // 23.3.3.2 WeakMap.prototype.delete(key)
+ // 23.4.3.3 WeakSet.prototype.delete(value)
+ 'delete': function (key) {
+ if (!_isObject(key)) return false;
+ var data = getWeak(key);
+ if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME))['delete'](key);
+ return data && _has(data, this._i) && delete data[this._i];
+ },
+ // 23.3.3.4 WeakMap.prototype.has(key)
+ // 23.4.3.4 WeakSet.prototype.has(value)
+ has: function has(key) {
+ if (!_isObject(key)) return false;
+ var data = getWeak(key);
+ if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME)).has(key);
+ return data && _has(data, this._i);
+ }
+ });
+ return C;
+ },
+ def: function (that, key, value) {
+ var data = getWeak(_anObject(key), true);
+ if (data === true) uncaughtFrozenStore(that).set(key, value);
+ else data[that._i] = value;
+ return that;
+ },
+ ufstore: uncaughtFrozenStore
+ };
+
+ var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
+ var Base = _global[NAME];
+ var C = Base;
+ var ADDER = IS_MAP ? 'set' : 'add';
+ var proto = C && C.prototype;
+ var O = {};
+ var fixMethod = function (KEY) {
+ var fn = proto[KEY];
+ _redefine(proto, KEY,
+ KEY == 'delete' ? function (a) {
+ return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+ } : KEY == 'has' ? function has(a) {
+ return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+ } : KEY == 'get' ? function get(a) {
+ return IS_WEAK && !_isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
+ } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }
+ : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }
+ );
+ };
+ if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () {
+ new C().entries().next();
+ }))) {
+ // create collection constructor
+ C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
+ _redefineAll(C.prototype, methods);
+ _meta.NEED = true;
+ } else {
+ var instance = new C();
+ // early implementations not supports chaining
+ var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
+ // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
+ var THROWS_ON_PRIMITIVES = _fails(function () { instance.has(1); });
+ // most early implementations doesn't supports iterables, most modern - not close it correctly
+ var ACCEPT_ITERABLES = _iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new
+ // for early implementations -0 and +0 not the same
+ var BUGGY_ZERO = !IS_WEAK && _fails(function () {
+ // V8 ~ Chromium 42- fails only with 5+ elements
+ var $instance = new C();
+ var index = 5;
+ while (index--) $instance[ADDER](index, index);
+ return !$instance.has(-0);
+ });
+ if (!ACCEPT_ITERABLES) {
+ C = wrapper(function (target, iterable) {
+ _anInstance(target, C, NAME);
+ var that = _inheritIfRequired(new Base(), target, C);
+ if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
+ return that;
+ });
+ C.prototype = proto;
+ proto.constructor = C;
+ }
+ if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
+ fixMethod('delete');
+ fixMethod('has');
+ IS_MAP && fixMethod('get');
+ }
+ if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
+ // weak collections should not contains .clear method
+ if (IS_WEAK && proto.clear) delete proto.clear;
+ }
+
+ _setToStringTag(C, NAME);
+
+ O[NAME] = C;
+ _export(_export.G + _export.W + _export.F * (C != Base), O);
+
+ if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
+
+ return C;
+ };
+
+ var es6_weakMap = createCommonjsModule(function (module) {
+ var each = _arrayMethods(0);
+
+
+
+
+
+
+
+ var WEAK_MAP = 'WeakMap';
+ var getWeak = _meta.getWeak;
+ var isExtensible = Object.isExtensible;
+ var uncaughtFrozenStore = _collectionWeak.ufstore;
+ var tmp = {};
+ var InternalMap;
+
+ var wrapper = function (get) {
+ return function WeakMap() {
+ return get(this, arguments.length > 0 ? arguments[0] : undefined);
+ };
+ };
+
+ var methods = {
+ // 23.3.3.3 WeakMap.prototype.get(key)
+ get: function get(key) {
+ if (_isObject(key)) {
+ var data = getWeak(key);
+ if (data === true) return uncaughtFrozenStore(_validateCollection(this, WEAK_MAP)).get(key);
+ return data ? data[this._i] : undefined;
+ }
+ },
+ // 23.3.3.5 WeakMap.prototype.set(key, value)
+ set: function set(key, value) {
+ return _collectionWeak.def(_validateCollection(this, WEAK_MAP), key, value);
+ }
+ };
+
+ // 23.3 WeakMap Objects
+ var $WeakMap = module.exports = _collection(WEAK_MAP, wrapper, methods, _collectionWeak, true, true);
+
+ // IE11 WeakMap frozen keys fix
+ if (_fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {
+ InternalMap = _collectionWeak.getConstructor(wrapper, WEAK_MAP);
+ _objectAssign(InternalMap.prototype, methods);
+ _meta.NEED = true;
+ each(['delete', 'has', 'get', 'set'], function (key) {
+ var proto = $WeakMap.prototype;
+ var method = proto[key];
+ _redefine(proto, key, function (a, b) {
+ // store frozen objects on internal weakmap shim
+ if (_isObject(a) && !isExtensible(a)) {
+ if (!this._f) this._f = new InternalMap();
+ var result = this._f[key](a, b);
+ return key == 'set' ? this : result;
+ // store all the rest on native weakmap
+ } return method.call(this, a, b);
+ });
+ });
+ }
+ });
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ }
+
+ function _slicedToArray(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
+ }
+
+ function _toConsumableArray(arr) {
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
+ }
+
+ function _arrayWithoutHoles(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+
+ return arr2;
+ }
+ }
+
+ function _arrayWithHoles(arr) {
+ if (Array.isArray(arr)) return arr;
+ }
+
+ function _iterableToArray(iter) {
+ if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
+ }
+
+ function _iterableToArrayLimit(arr, i) {
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
+
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
+
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"] != null) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+
+ return _arr;
+ }
+
+ function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance");
+ }
+
+ function _nonIterableRest() {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ }
+
+ // 19.1.3.1 Object.assign(target, source)
+
+
+ _export(_export.S + _export.F, 'Object', { assign: _objectAssign });
+
+ // @@split logic
+ _fixReWks('split', 2, function (defined, SPLIT, $split) {
+ var isRegExp = _isRegexp;
+ var _split = $split;
+ var $push = [].push;
+ var $SPLIT = 'split';
+ var LENGTH = 'length';
+ var LAST_INDEX = 'lastIndex';
+ if (
+ 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||
+ 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||
+ 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||
+ '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||
+ '.'[$SPLIT](/()()/)[LENGTH] > 1 ||
+ ''[$SPLIT](/.?/)[LENGTH]
+ ) {
+ var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group
+ // based on es5-shim implementation, need to rework it
+ $split = function (separator, limit) {
+ var string = String(this);
+ if (separator === undefined && limit === 0) return [];
+ // If `separator` is not a regex, use native split
+ if (!isRegExp(separator)) return _split.call(string, separator, limit);
+ var output = [];
+ var flags = (separator.ignoreCase ? 'i' : '') +
+ (separator.multiline ? 'm' : '') +
+ (separator.unicode ? 'u' : '') +
+ (separator.sticky ? 'y' : '');
+ var lastLastIndex = 0;
+ var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;
+ // Make `global` and avoid `lastIndex` issues by working with a copy
+ var separatorCopy = new RegExp(separator.source, flags + 'g');
+ var separator2, match, lastIndex, lastLength, i;
+ // Doesn't need flags gy, but they don't hurt
+ if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
+ while (match = separatorCopy.exec(string)) {
+ // `separatorCopy.lastIndex` is not reliable cross-browser
+ lastIndex = match.index + match[0][LENGTH];
+ if (lastIndex > lastLastIndex) {
+ output.push(string.slice(lastLastIndex, match.index));
+ // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG
+ // eslint-disable-next-line no-loop-func
+ if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {
+ for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;
+ });
+ if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
+ lastLength = match[0][LENGTH];
+ lastLastIndex = lastIndex;
+ if (output[LENGTH] >= splitLimit) break;
+ }
+ if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop
+ }
+ if (lastLastIndex === string[LENGTH]) {
+ if (lastLength || !separatorCopy.test('')) output.push('');
+ } else output.push(string.slice(lastLastIndex));
+ return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
+ };
+ // Chakra, V8
+ } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
+ $split = function (separator, limit) {
+ return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);
+ };
+ }
+ // 21.1.3.17 String.prototype.split(separator, limit)
+ return [function split(separator, limit) {
+ var O = defined(this);
+ var fn = separator == undefined ? undefined : separator[SPLIT];
+ return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);
+ }, $split];
+ });
+
+ var isEnum = _objectPie.f;
+ var _objectToArray = function (isEntries) {
+ return function (it) {
+ var O = _toIobject(it);
+ var keys = _objectKeys(O);
+ var length = keys.length;
+ var i = 0;
+ var result = [];
+ var key;
+ while (length > i) if (isEnum.call(O, key = keys[i++])) {
+ result.push(isEntries ? [key, O[key]] : O[key]);
+ } return result;
+ };
+ };
+
+ // https://github.com/tc39/proposal-object-values-entries
+
+ var $entries = _objectToArray(true);
+
+ _export(_export.S, 'Object', {
+ entries: function entries(it) {
+ return $entries(it);
+ }
+ });
+
+ // https://github.com/tc39/proposal-object-values-entries
+
+ var $values = _objectToArray(false);
+
+ _export(_export.S, 'Object', {
+ values: function values(it) {
+ return $values(it);
+ }
+ });
+
+ // @@replace logic
+ _fixReWks('replace', 2, function (defined, REPLACE, $replace) {
+ // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)
+ return [function replace(searchValue, replaceValue) {
+ var O = defined(this);
+ var fn = searchValue == undefined ? undefined : searchValue[REPLACE];
+ return fn !== undefined
+ ? fn.call(searchValue, O, replaceValue)
+ : $replace.call(String(O), searchValue, replaceValue);
+ }, $replace];
+ });
+
+ // 7.3.20 SpeciesConstructor(O, defaultConstructor)
+
+
+ var SPECIES$1 = _wks('species');
+ var _speciesConstructor = function (O, D) {
+ var C = _anObject(O).constructor;
+ var S;
+ return C === undefined || (S = _anObject(C)[SPECIES$1]) == undefined ? D : _aFunction(S);
+ };
+
+ // fast apply, http://jsperf.lnkit.com/fast-apply/5
+ var _invoke = function (fn, args, that) {
+ var un = that === undefined;
+ switch (args.length) {
+ case 0: return un ? fn()
+ : fn.call(that);
+ case 1: return un ? fn(args[0])
+ : fn.call(that, args[0]);
+ case 2: return un ? fn(args[0], args[1])
+ : fn.call(that, args[0], args[1]);
+ case 3: return un ? fn(args[0], args[1], args[2])
+ : fn.call(that, args[0], args[1], args[2]);
+ case 4: return un ? fn(args[0], args[1], args[2], args[3])
+ : fn.call(that, args[0], args[1], args[2], args[3]);
+ } return fn.apply(that, args);
+ };
+
+ var process = _global.process;
+ var setTask = _global.setImmediate;
+ var clearTask = _global.clearImmediate;
+ var MessageChannel = _global.MessageChannel;
+ var Dispatch = _global.Dispatch;
+ var counter = 0;
+ var queue = {};
+ var ONREADYSTATECHANGE = 'onreadystatechange';
+ var defer, channel, port;
+ var run = function () {
+ var id = +this;
+ // eslint-disable-next-line no-prototype-builtins
+ if (queue.hasOwnProperty(id)) {
+ var fn = queue[id];
+ delete queue[id];
+ fn();
+ }
+ };
+ var listener = function (event) {
+ run.call(event.data);
+ };
+ // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
+ if (!setTask || !clearTask) {
+ setTask = function setImmediate(fn) {
+ var args = [];
+ var i = 1;
+ while (arguments.length > i) args.push(arguments[i++]);
+ queue[++counter] = function () {
+ // eslint-disable-next-line no-new-func
+ _invoke(typeof fn == 'function' ? fn : Function(fn), args);
+ };
+ defer(counter);
+ return counter;
+ };
+ clearTask = function clearImmediate(id) {
+ delete queue[id];
+ };
+ // Node.js 0.8-
+ if (_cof(process) == 'process') {
+ defer = function (id) {
+ process.nextTick(_ctx(run, id, 1));
+ };
+ // Sphere (JS game engine) Dispatch API
+ } else if (Dispatch && Dispatch.now) {
+ defer = function (id) {
+ Dispatch.now(_ctx(run, id, 1));
+ };
+ // Browsers with MessageChannel, includes WebWorkers
+ } else if (MessageChannel) {
+ channel = new MessageChannel();
+ port = channel.port2;
+ channel.port1.onmessage = listener;
+ defer = _ctx(port.postMessage, port, 1);
+ // Browsers with postMessage, skip WebWorkers
+ // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
+ } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {
+ defer = function (id) {
+ _global.postMessage(id + '', '*');
+ };
+ _global.addEventListener('message', listener, false);
+ // IE8-
+ } else if (ONREADYSTATECHANGE in _domCreate('script')) {
+ defer = function (id) {
+ _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {
+ _html.removeChild(this);
+ run.call(id);
+ };
+ };
+ // Rest old browsers
+ } else {
+ defer = function (id) {
+ setTimeout(_ctx(run, id, 1), 0);
+ };
+ }
+ }
+ var _task = {
+ set: setTask,
+ clear: clearTask
+ };
+
+ var macrotask = _task.set;
+ var Observer = _global.MutationObserver || _global.WebKitMutationObserver;
+ var process$1 = _global.process;
+ var Promise$1 = _global.Promise;
+ var isNode = _cof(process$1) == 'process';
+
+ var _microtask = function () {
+ var head, last, notify;
+
+ var flush = function () {
+ var parent, fn;
+ if (isNode && (parent = process$1.domain)) parent.exit();
+ while (head) {
+ fn = head.fn;
+ head = head.next;
+ try {
+ fn();
+ } catch (e) {
+ if (head) notify();
+ else last = undefined;
+ throw e;
+ }
+ } last = undefined;
+ if (parent) parent.enter();
+ };
+
+ // Node.js
+ if (isNode) {
+ notify = function () {
+ process$1.nextTick(flush);
+ };
+ // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
+ } else if (Observer && !(_global.navigator && _global.navigator.standalone)) {
+ var toggle = true;
+ var node = document.createTextNode('');
+ new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
+ notify = function () {
+ node.data = toggle = !toggle;
+ };
+ // environments with maybe non-completely correct, but existent Promise
+ } else if (Promise$1 && Promise$1.resolve) {
+ // Promise.resolve without an argument throws an error in LG WebOS 2
+ var promise = Promise$1.resolve(undefined);
+ notify = function () {
+ promise.then(flush);
+ };
+ // for other environments - macrotask based on:
+ // - setImmediate
+ // - MessageChannel
+ // - window.postMessag
+ // - onreadystatechange
+ // - setTimeout
+ } else {
+ notify = function () {
+ // strange IE + webpack dev server bug - use .call(global)
+ macrotask.call(_global, flush);
+ };
+ }
+
+ return function (fn) {
+ var task = { fn: fn, next: undefined };
+ if (last) last.next = task;
+ if (!head) {
+ head = task;
+ notify();
+ } last = task;
+ };
+ };
+
+ // 25.4.1.5 NewPromiseCapability(C)
+
+
+ function PromiseCapability(C) {
+ var resolve, reject;
+ this.promise = new C(function ($$resolve, $$reject) {
+ if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
+ resolve = $$resolve;
+ reject = $$reject;
+ });
+ this.resolve = _aFunction(resolve);
+ this.reject = _aFunction(reject);
+ }
+
+ var f$5 = function (C) {
+ return new PromiseCapability(C);
+ };
+
+ var _newPromiseCapability = {
+ f: f$5
+ };
+
+ var _perform = function (exec) {
+ try {
+ return { e: false, v: exec() };
+ } catch (e) {
+ return { e: true, v: e };
+ }
+ };
+
+ var navigator$1 = _global.navigator;
+
+ var _userAgent = navigator$1 && navigator$1.userAgent || '';
+
+ var _promiseResolve = function (C, x) {
+ _anObject(C);
+ if (_isObject(x) && x.constructor === C) return x;
+ var promiseCapability = _newPromiseCapability.f(C);
+ var resolve = promiseCapability.resolve;
+ resolve(x);
+ return promiseCapability.promise;
+ };
+
+ var SPECIES$2 = _wks('species');
+
+ var _setSpecies = function (KEY) {
+ var C = _global[KEY];
+ if (_descriptors && C && !C[SPECIES$2]) _objectDp.f(C, SPECIES$2, {
+ configurable: true,
+ get: function () { return this; }
+ });
+ };
+
+ var task = _task.set;
+ var microtask = _microtask();
+
+
+
+
+ var PROMISE = 'Promise';
+ var TypeError$1 = _global.TypeError;
+ var process$2 = _global.process;
+ var versions = process$2 && process$2.versions;
+ var v8 = versions && versions.v8 || '';
+ var $Promise = _global[PROMISE];
+ var isNode$1 = _classof(process$2) == 'process';
+ var empty = function () { /* empty */ };
+ var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
+ var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;
+
+ var USE_NATIVE = !!function () {
+ try {
+ // correct subclassing with @@species support
+ var promise = $Promise.resolve(1);
+ var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
+ exec(empty, empty);
+ };
+ // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
+ return (isNode$1 || typeof PromiseRejectionEvent == 'function')
+ && promise.then(empty) instanceof FakePromise
+ // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
+ // we can't detect it synchronously, so just check versions
+ && v8.indexOf('6.6') !== 0
+ && _userAgent.indexOf('Chrome/66') === -1;
+ } catch (e) { /* empty */ }
+ }();
+
+ // helpers
+ var isThenable = function (it) {
+ var then;
+ return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;
+ };
+ var notify = function (promise, isReject) {
+ if (promise._n) return;
+ promise._n = true;
+ var chain = promise._c;
+ microtask(function () {
+ var value = promise._v;
+ var ok = promise._s == 1;
+ var i = 0;
+ var run = function (reaction) {
+ var handler = ok ? reaction.ok : reaction.fail;
+ var resolve = reaction.resolve;
+ var reject = reaction.reject;
+ var domain = reaction.domain;
+ var result, then, exited;
+ try {
+ if (handler) {
+ if (!ok) {
+ if (promise._h == 2) onHandleUnhandled(promise);
+ promise._h = 1;
+ }
+ if (handler === true) result = value;
+ else {
+ if (domain) domain.enter();
+ result = handler(value); // may throw
+ if (domain) {
+ domain.exit();
+ exited = true;
+ }
+ }
+ if (result === reaction.promise) {
+ reject(TypeError$1('Promise-chain cycle'));
+ } else if (then = isThenable(result)) {
+ then.call(result, resolve, reject);
+ } else resolve(result);
+ } else reject(value);
+ } catch (e) {
+ if (domain && !exited) domain.exit();
+ reject(e);
+ }
+ };
+ while (chain.length > i) run(chain[i++]); // variable length - can't use forEach
+ promise._c = [];
+ promise._n = false;
+ if (isReject && !promise._h) onUnhandled(promise);
+ });
+ };
+ var onUnhandled = function (promise) {
+ task.call(_global, function () {
+ var value = promise._v;
+ var unhandled = isUnhandled(promise);
+ var result, handler, console;
+ if (unhandled) {
+ result = _perform(function () {
+ if (isNode$1) {
+ process$2.emit('unhandledRejection', value, promise);
+ } else if (handler = _global.onunhandledrejection) {
+ handler({ promise: promise, reason: value });
+ } else if ((console = _global.console) && console.error) {
+ console.error('Unhandled promise rejection', value);
+ }
+ });
+ // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
+ promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1;
+ } promise._a = undefined;
+ if (unhandled && result.e) throw result.v;
+ });
+ };
+ var isUnhandled = function (promise) {
+ return promise._h !== 1 && (promise._a || promise._c).length === 0;
+ };
+ var onHandleUnhandled = function (promise) {
+ task.call(_global, function () {
+ var handler;
+ if (isNode$1) {
+ process$2.emit('rejectionHandled', promise);
+ } else if (handler = _global.onrejectionhandled) {
+ handler({ promise: promise, reason: promise._v });
+ }
+ });
+ };
+ var $reject = function (value) {
+ var promise = this;
+ if (promise._d) return;
+ promise._d = true;
+ promise = promise._w || promise; // unwrap
+ promise._v = value;
+ promise._s = 2;
+ if (!promise._a) promise._a = promise._c.slice();
+ notify(promise, true);
+ };
+ var $resolve = function (value) {
+ var promise = this;
+ var then;
+ if (promise._d) return;
+ promise._d = true;
+ promise = promise._w || promise; // unwrap
+ try {
+ if (promise === value) throw TypeError$1("Promise can't be resolved itself");
+ if (then = isThenable(value)) {
+ microtask(function () {
+ var wrapper = { _w: promise, _d: false }; // wrap
+ try {
+ then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1));
+ } catch (e) {
+ $reject.call(wrapper, e);
+ }
+ });
+ } else {
+ promise._v = value;
+ promise._s = 1;
+ notify(promise, false);
+ }
+ } catch (e) {
+ $reject.call({ _w: promise, _d: false }, e); // wrap
+ }
+ };
+
+ // constructor polyfill
+ if (!USE_NATIVE) {
+ // 25.4.3.1 Promise(executor)
+ $Promise = function Promise(executor) {
+ _anInstance(this, $Promise, PROMISE, '_h');
+ _aFunction(executor);
+ Internal.call(this);
+ try {
+ executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));
+ } catch (err) {
+ $reject.call(this, err);
+ }
+ };
+ // eslint-disable-next-line no-unused-vars
+ Internal = function Promise(executor) {
+ this._c = []; // <- awaiting reactions
+ this._a = undefined; // <- checked in isUnhandled reactions
+ this._s = 0; // <- state
+ this._d = false; // <- done
+ this._v = undefined; // <- value
+ this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
+ this._n = false; // <- notify
+ };
+ Internal.prototype = _redefineAll($Promise.prototype, {
+ // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
+ then: function then(onFulfilled, onRejected) {
+ var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));
+ reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
+ reaction.fail = typeof onRejected == 'function' && onRejected;
+ reaction.domain = isNode$1 ? process$2.domain : undefined;
+ this._c.push(reaction);
+ if (this._a) this._a.push(reaction);
+ if (this._s) notify(this, false);
+ return reaction.promise;
+ },
+ // 25.4.5.1 Promise.prototype.catch(onRejected)
+ 'catch': function (onRejected) {
+ return this.then(undefined, onRejected);
+ }
+ });
+ OwnPromiseCapability = function () {
+ var promise = new Internal();
+ this.promise = promise;
+ this.resolve = _ctx($resolve, promise, 1);
+ this.reject = _ctx($reject, promise, 1);
+ };
+ _newPromiseCapability.f = newPromiseCapability = function (C) {
+ return C === $Promise || C === Wrapper
+ ? new OwnPromiseCapability(C)
+ : newGenericPromiseCapability(C);
+ };
+ }
+
+ _export(_export.G + _export.W + _export.F * !USE_NATIVE, { Promise: $Promise });
+ _setToStringTag($Promise, PROMISE);
+ _setSpecies(PROMISE);
+ Wrapper = _core[PROMISE];
+
+ // statics
+ _export(_export.S + _export.F * !USE_NATIVE, PROMISE, {
+ // 25.4.4.5 Promise.reject(r)
+ reject: function reject(r) {
+ var capability = newPromiseCapability(this);
+ var $$reject = capability.reject;
+ $$reject(r);
+ return capability.promise;
+ }
+ });
+ _export(_export.S + _export.F * (!USE_NATIVE), PROMISE, {
+ // 25.4.4.6 Promise.resolve(x)
+ resolve: function resolve(x) {
+ return _promiseResolve(_library && this === Wrapper ? $Promise : this, x);
+ }
+ });
+ _export(_export.S + _export.F * !(USE_NATIVE && _iterDetect(function (iter) {
+ $Promise.all(iter)['catch'](empty);
+ })), PROMISE, {
+ // 25.4.4.1 Promise.all(iterable)
+ all: function all(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var resolve = capability.resolve;
+ var reject = capability.reject;
+ var result = _perform(function () {
+ var values = [];
+ var index = 0;
+ var remaining = 1;
+ _forOf(iterable, false, function (promise) {
+ var $index = index++;
+ var alreadyCalled = false;
+ values.push(undefined);
+ remaining++;
+ C.resolve(promise).then(function (value) {
+ if (alreadyCalled) return;
+ alreadyCalled = true;
+ values[$index] = value;
+ --remaining || resolve(values);
+ }, reject);
+ });
+ --remaining || resolve(values);
+ });
+ if (result.e) reject(result.v);
+ return capability.promise;
+ },
+ // 25.4.4.4 Promise.race(iterable)
+ race: function race(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var reject = capability.reject;
+ var result = _perform(function () {
+ _forOf(iterable, false, function (promise) {
+ C.resolve(promise).then(capability.resolve, reject);
+ });
+ });
+ if (result.e) reject(result.v);
+ return capability.promise;
+ }
+ });
+
+ var STARTS_WITH = 'startsWith';
+ var $startsWith = ''[STARTS_WITH];
+
+ _export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', {
+ startsWith: function startsWith(searchString /* , position = 0 */) {
+ var that = _stringContext(this, searchString, STARTS_WITH);
+ var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
+ var search = String(searchString);
+ return $startsWith
+ ? $startsWith.call(that, search, index)
+ : that.slice(index, index + search.length) === search;
+ }
+ });
+
+ // 20.1.2.4 Number.isNaN(number)
+
+
+ _export(_export.S, 'Number', {
+ isNaN: function isNaN(number) {
+ // eslint-disable-next-line no-self-compare
+ return number != number;
+ }
+ });
+
+ // ==========================================================================
+ // Type checking utils
+ // ==========================================================================
+ var getConstructor = function getConstructor(input) {
+ return input !== null && typeof input !== 'undefined' ? input.constructor : null;
+ };
+
+ var instanceOf = function instanceOf(input, constructor) {
+ return Boolean(input && constructor && input instanceof constructor);
+ };
+
+ var isNullOrUndefined = function isNullOrUndefined(input) {
+ return input === null || typeof input === 'undefined';
+ };
+
+ var isObject = function isObject(input) {
+ return getConstructor(input) === Object;
+ };
+
+ var isNumber = function isNumber(input) {
+ return getConstructor(input) === Number && !Number.isNaN(input);
+ };
+
+ var isString = function isString(input) {
+ return getConstructor(input) === String;
+ };
+
+ var isBoolean = function isBoolean(input) {
+ return getConstructor(input) === Boolean;
+ };
+
+ var isFunction = function isFunction(input) {
+ return getConstructor(input) === Function;
+ };
+
+ var isArray = function isArray(input) {
+ return Array.isArray(input);
+ };
+
+ var isWeakMap = function isWeakMap(input) {
+ return instanceOf(input, WeakMap);
+ };
+
+ var isNodeList = function isNodeList(input) {
+ return instanceOf(input, NodeList);
+ };
+
+ var isElement = function isElement(input) {
+ return instanceOf(input, Element);
+ };
+
+ var isTextNode = function isTextNode(input) {
+ return getConstructor(input) === Text;
+ };
+
+ var isEvent = function isEvent(input) {
+ return instanceOf(input, Event);
+ };
+
+ var isKeyboardEvent = function isKeyboardEvent(input) {
+ return instanceOf(input, KeyboardEvent);
+ };
+
+ var isCue = function isCue(input) {
+ return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);
+ };
+
+ var isTrack = function isTrack(input) {
+ return instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);
+ };
+
+ var isEmpty = function isEmpty(input) {
+ return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;
+ };
+
+ var isUrl = function isUrl(input) {
+ // Accept a URL object
+ if (instanceOf(input, window.URL)) {
+ return true;
+ } // Add the protocol if required
+
+
+ var string = input;
+
+ if (!input.startsWith('http://') || !input.startsWith('https://')) {
+ string = "http://".concat(input);
+ }
+
+ try {
+ return !isEmpty(new URL(string).hostname);
+ } catch (e) {
+ return false;
+ }
+ };
+
+ var is$1 = {
+ nullOrUndefined: isNullOrUndefined,
+ object: isObject,
+ number: isNumber,
+ string: isString,
+ boolean: isBoolean,
+ function: isFunction,
+ array: isArray,
+ weakMap: isWeakMap,
+ nodeList: isNodeList,
+ element: isElement,
+ textNode: isTextNode,
+ event: isEvent,
+ keyboardEvent: isKeyboardEvent,
+ cue: isCue,
+ track: isTrack,
+ url: isUrl,
+ empty: isEmpty
+ };
+
+ // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
+ // https://www.youtube.com/watch?v=NPM6172J22g
+
+ var supportsPassiveListeners = function () {
+ // Test via a getter in the options object to see if the passive property is accessed
+ var supported = false;
+
+ try {
+ var options = Object.defineProperty({}, 'passive', {
+ get: function get() {
+ supported = true;
+ return null;
+ }
+ });
+ window.addEventListener('test', null, options);
+ window.removeEventListener('test', null, options);
+ } catch (e) {// Do nothing
+ }
+
+ return supported;
+ }(); // Toggle event listener
+
+
+ function toggleListener(element, event, callback) {
+ var _this = this;
+
+ var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
+ var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
+
+ // Bail if no element, event, or callback
+ if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {
+ return;
+ } // Allow multiple events
+
+
+ var events = event.split(' '); // Build options
+ // Default to just the capture boolean for browsers with no passive listener support
+
+ var options = capture; // If passive events listeners are supported
+
+ if (supportsPassiveListeners) {
+ options = {
+ // Whether the listener can be passive (i.e. default never prevented)
+ passive: passive,
+ // Whether the listener is a capturing listener or not
+ capture: capture
+ };
+ } // If a single node is passed, bind the event listener
+
+
+ events.forEach(function (type) {
+ if (_this && _this.eventListeners && toggle) {
+ // Cache event listener
+ _this.eventListeners.push({
+ element: element,
+ type: type,
+ callback: callback,
+ options: options
+ });
+ }
+
+ element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
+ });
+ } // Bind event handler
+
+ function on(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+ toggleListener.call(this, element, events, callback, true, passive, capture);
+ } // Unbind event handler
+
+ function off(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+ toggleListener.call(this, element, events, callback, false, passive, capture);
+ } // Bind once-only event handler
+
+ function once(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+
+ function onceCallback() {
+ off(element, events, onceCallback, passive, capture);
+
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ callback.apply(this, args);
+ }
+
+ toggleListener.call(this, element, events, onceCallback, true, passive, capture);
+ } // Trigger event
+
+ function triggerEvent(element) {
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+
+ // Bail if no element
+ if (!is$1.element(element) || is$1.empty(type)) {
+ return;
+ } // Create and dispatch the event
+
+
+ var event = new CustomEvent(type, {
+ bubbles: bubbles,
+ detail: Object.assign({}, detail, {
+ plyr: this
+ })
+ }); // Dispatch the event
+
+ element.dispatchEvent(event);
+ } // Unbind all cached event listeners
+
+ function unbindListeners() {
+ if (this && this.eventListeners) {
+ this.eventListeners.forEach(function (item) {
+ var element = item.element,
+ type = item.type,
+ callback = item.callback,
+ options = item.options;
+ element.removeEventListener(type, callback, options);
+ });
+ this.eventListeners = [];
+ }
+ } // Run method when / if player is ready
+
+ function ready() {
+ var _this2 = this;
+
+ return new Promise(function (resolve) {
+ return _this2.ready ? setTimeout(resolve, 0) : on.call(_this2, _this2.elements.container, 'ready', resolve);
+ }).then(function () {});
+ }
+
+ function wrap(elements, wrapper) {
+ // Convert `elements` to an array, if necessary.
+ var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the
+ // first element (see `child` below).
+
+ Array.from(targets).reverse().forEach(function (element, index) {
+ var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.
+
+ var parent = element.parentNode;
+ var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current
+ // parent).
+
+ child.appendChild(element); // If the element had a sibling, insert the wrapper before
+ // the sibling to maintain the HTML structure; otherwise, just
+ // append it to the parent.
+
+ if (sibling) {
+ parent.insertBefore(child, sibling);
+ } else {
+ parent.appendChild(child);
+ }
+ });
+ } // Set attributes
+
+ function setAttributes(element, attributes) {
+ if (!is$1.element(element) || is$1.empty(attributes)) {
+ return;
+ } // Assume null and undefined attributes should be left out,
+ // Setting them would otherwise convert them to "null" and "undefined"
+
+
+ Object.entries(attributes).filter(function (_ref) {
+ var _ref2 = _slicedToArray(_ref, 2),
+ value = _ref2[1];
+
+ return !is$1.nullOrUndefined(value);
+ }).forEach(function (_ref3) {
+ var _ref4 = _slicedToArray(_ref3, 2),
+ key = _ref4[0],
+ value = _ref4[1];
+
+ return element.setAttribute(key, value);
+ });
+ } // Create a DocumentFragment
+
+ function createElement(type, attributes, text) {
+ // Create a new <element>
+ var element = document.createElement(type); // Set all passed attributes
+
+ if (is$1.object(attributes)) {
+ setAttributes(element, attributes);
+ } // Add text node
+
+
+ if (is$1.string(text)) {
+ element.innerText = text;
+ } // Return built element
+
+
+ return element;
+ } // Inaert an element after another
+
+ function insertAfter(element, target) {
+ if (!is$1.element(element) || !is$1.element(target)) {
+ return;
+ }
+
+ target.parentNode.insertBefore(element, target.nextSibling);
+ } // Insert a DocumentFragment
+
+ function insertElement(type, parent, attributes, text) {
+ if (!is$1.element(parent)) {
+ return;
+ }
+
+ parent.appendChild(createElement(type, attributes, text));
+ } // Remove element(s)
+
+ function removeElement(element) {
+ if (is$1.nodeList(element) || is$1.array(element)) {
+ Array.from(element).forEach(removeElement);
+ return;
+ }
+
+ if (!is$1.element(element) || !is$1.element(element.parentNode)) {
+ return;
+ }
+
+ element.parentNode.removeChild(element);
+ } // Remove all child elements
+
+ function emptyElement(element) {
+ if (!is$1.element(element)) {
+ return;
+ }
+
+ var length = element.childNodes.length;
+
+ while (length > 0) {
+ element.removeChild(element.lastChild);
+ length -= 1;
+ }
+ } // Replace element
+
+ function replaceElement(newChild, oldChild) {
+ if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {
+ return null;
+ }
+
+ oldChild.parentNode.replaceChild(newChild, oldChild);
+ return newChild;
+ } // Get an attribute object from a string selector
+
+ function getAttributesFromSelector(sel, existingAttributes) {
+ // For example:
+ // '.test' to { class: 'test' }
+ // '#test' to { id: 'test' }
+ // '[data-test="test"]' to { 'data-test': 'test' }
+ if (!is$1.string(sel) || is$1.empty(sel)) {
+ return {};
+ }
+
+ var attributes = {};
+ var existing = existingAttributes;
+ sel.split(',').forEach(function (s) {
+ // Remove whitespace
+ var selector = s.trim();
+ var className = selector.replace('.', '');
+ var stripped = selector.replace(/[[\]]/g, ''); // Get the parts and value
+
+ var parts = stripped.split('=');
+ var key = parts[0];
+ var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : ''; // Get the first character
+
+ var start = selector.charAt(0);
+
+ switch (start) {
+ case '.':
+ // Add to existing classname
+ if (is$1.object(existing) && is$1.string(existing.class)) {
+ existing.class += " ".concat(className);
+ }
+
+ attributes.class = className;
+ break;
+
+ case '#':
+ // ID selector
+ attributes.id = selector.replace('#', '');
+ break;
+
+ case '[':
+ // Attribute selector
+ attributes[key] = value;
+ break;
+
+ default:
+ break;
+ }
+ });
+ return attributes;
+ } // Toggle hidden
+
+ function toggleHidden(element, hidden) {
+ if (!is$1.element(element)) {
+ return;
+ }
+
+ var hide = hidden;
+
+ if (!is$1.boolean(hide)) {
+ hide = !element.hidden;
+ }
+
+ if (hide) {
+ element.setAttribute('hidden', '');
+ } else {
+ element.removeAttribute('hidden');
+ }
+ } // Mirror Element.classList.toggle, with IE compatibility for "force" argument
+
+ function toggleClass(element, className, force) {
+ if (is$1.nodeList(element)) {
+ return Array.from(element).map(function (e) {
+ return toggleClass(e, className, force);
+ });
+ }
+
+ if (is$1.element(element)) {
+ var method = 'toggle';
+
+ if (typeof force !== 'undefined') {
+ method = force ? 'add' : 'remove';
+ }
+
+ element.classList[method](className);
+ return element.classList.contains(className);
+ }
+
+ return false;
+ } // Has class name
+
+ function hasClass(element, className) {
+ return is$1.element(element) && element.classList.contains(className);
+ } // Element matches selector
+
+ function matches(element, selector) {
+ var prototype = {
+ Element: Element
+ };
+
+ function match() {
+ return Array.from(document.querySelectorAll(selector)).includes(this);
+ }
+
+ var matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
+ return matches.call(element, selector);
+ } // Find all elements
+
+ function getElements(selector) {
+ return this.elements.container.querySelectorAll(selector);
+ } // Find a single element
+
+ function getElement(selector) {
+ return this.elements.container.querySelector(selector);
+ } // Trap focus inside container
+
+ function trapFocus() {
+ var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (!is$1.element(element)) {
+ return;
+ }
+
+ var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
+ var first = focusable[0];
+ var last = focusable[focusable.length - 1];
+
+ var trap = function trap(event) {
+ // Bail if not tab key or not fullscreen
+ if (event.key !== 'Tab' || event.keyCode !== 9) {
+ return;
+ } // Get the current focused element
+
+
+ var focused = document.activeElement;
+
+ if (focused === last && !event.shiftKey) {
+ // Move focus to first element that can be tabbed if Shift isn't used
+ first.focus();
+ event.preventDefault();
+ } else if (focused === first && event.shiftKey) {
+ // Move focus to last element that can be tabbed if Shift is used
+ last.focus();
+ event.preventDefault();
+ }
+ };
+
+ toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
+ } // Set focus and tab focus class
+
+ function setFocus() {
+ var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (!is$1.element(element)) {
+ return;
+ } // Set regular focus
+
+
+ element.focus(); // If we want to mimic keyboard focus via tab
+
+ if (tabFocus) {
+ toggleClass(element, this.config.classNames.tabFocus);
+ }
+ }
+
+ var transitionEndEvent = function () {
+ var element = document.createElement('span');
+ var events = {
+ WebkitTransition: 'webkitTransitionEnd',
+ MozTransition: 'transitionend',
+ OTransition: 'oTransitionEnd otransitionend',
+ transition: 'transitionend'
+ };
+ var type = Object.keys(events).find(function (event) {
+ return element.style[event] !== undefined;
+ });
+ return is$1.string(type) ? events[type] : false;
+ }(); // Force repaint of element
+
+ function repaint(element) {
+ setTimeout(function () {
+ try {
+ toggleHidden(element, true);
+ element.offsetHeight; // eslint-disable-line
+
+ toggleHidden(element, false);
+ } catch (e) {// Do nothing
+ }
+ }, 0);
+ }
+
+ // ==========================================================================
+ // Browser sniffing
+ // Unfortunately, due to mixed support, UA sniffing is required
+ // ==========================================================================
+ var browser = {
+ isIE:
+ /* @cc_on!@ */
+ !!document.documentMode,
+ isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
+ isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
+ isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
+ };
+
+ var defaultCodecs = {
+ 'audio/ogg': 'vorbis',
+ 'audio/wav': '1',
+ 'video/webm': 'vp8, vorbis',
+ 'video/mp4': 'avc1.42E01E, mp4a.40.2',
+ 'video/ogg': 'theora'
+ }; // Check for feature support
+
+ var support = {
+ // Basic support
+ audio: 'canPlayType' in document.createElement('audio'),
+ video: 'canPlayType' in document.createElement('video'),
+ // Check for support
+ // Basic functionality vs full UI
+ check: function check(type, provider, playsinline) {
+ var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
+ var api = support[type] || provider !== 'html5';
+ var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
+ return {
+ api: api,
+ ui: ui
+ };
+ },
+ // Picture-in-picture support
+ // Safari only currently
+ pip: function () {
+ return !browser.isIPhone && is$1.function(createElement('video').webkitSetPresentationMode);
+ }(),
+ // Airplay support
+ // Safari only currently
+ airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),
+ // Inline playback support
+ // https://webkit.org/blog/6784/new-video-policies-for-ios/
+ playsinline: 'playsInline' in document.createElement('video'),
+ // Check for mime type support against a player instance
+ // Credits: http://diveintohtml5.info/everything.html
+ // Related: http://www.leanbackplayer.com/test/h5mt.html
+ mime: function mime(inputType) {
+ var _inputType$split = inputType.split('/'),
+ _inputType$split2 = _slicedToArray(_inputType$split, 1),
+ mediaType = _inputType$split2[0];
+
+ if (!this.isHTML5 || mediaType !== this.type) {
+ return false;
+ }
+
+ var type;
+
+ if (inputType && inputType.includes('codecs=')) {
+ // Use input directly
+ type = inputType;
+ } else if (inputType === 'audio/mpeg') {
+ // Skip codec
+ type = 'audio/mpeg;';
+ } else if (inputType in defaultCodecs) {
+ // Use codec
+ type = "".concat(inputType, "; codecs=\"").concat(defaultCodecs[inputType], "\"");
+ }
+
+ try {
+ return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
+ } catch (err) {
+ return false;
+ }
+ },
+ // Check for textTracks support
+ textTracks: 'textTracks' in document.createElement('video'),
+ // <input type="range"> Sliders
+ rangeInput: function () {
+ var range = document.createElement('input');
+ range.type = 'range';
+ return range.type === 'range';
+ }(),
+ // Touch
+ // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
+ touch: 'ontouchstart' in document.documentElement,
+ // Detect transitions support
+ transitions: transitionEndEvent !== false,
+ // Reduced motion iOS & MacOS setting
+ // https://webkit.org/blog/7551/responsive-design-for-motion/
+ reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
+ };
+
+ var html5 = {
+ getSources: function getSources() {
+ var _this = this;
+
+ if (!this.isHTML5) {
+ return [];
+ }
+
+ var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources
+
+ return sources.filter(function (source) {
+ return support.mime.call(_this, source.getAttribute('type'));
+ });
+ },
+ // Get quality levels
+ getQualityOptions: function getQualityOptions() {
+ // Get sizes from <source> elements
+ return html5.getSources.call(this).map(function (source) {
+ return Number(source.getAttribute('size'));
+ }).filter(Boolean);
+ },
+ extend: function extend() {
+ if (!this.isHTML5) {
+ return;
+ }
+
+ var player = this; // Quality
+
+ Object.defineProperty(player.media, 'quality', {
+ get: function get() {
+ // Get sources
+ var sources = html5.getSources.call(player);
+ var source = sources.find(function (source) {
+ return source.getAttribute('src') === player.source;
+ }); // Return size, if match is found
+
+ return source && Number(source.getAttribute('size'));
+ },
+ set: function set(input) {
+ // Get sources
+ var sources = html5.getSources.call(player); // Get first match for requested size
+
+ var source = sources.find(function (source) {
+ return Number(source.getAttribute('size')) === input;
+ }); // No matching source found
+
+ if (!source) {
+ return;
+ } // Get current state
+
+
+ var _player$media = player.media,
+ currentTime = _player$media.currentTime,
+ paused = _player$media.paused,
+ preload = _player$media.preload,
+ readyState = _player$media.readyState; // Set new source
+
+ player.media.src = source.getAttribute('src'); // Prevent loading if preload="none" and the current source isn't loaded (#1044)
+
+ if (preload !== 'none' || readyState) {
+ // Restore time
+ player.once('loadedmetadata', function () {
+ player.currentTime = currentTime; // Resume playing
+
+ if (!paused) {
+ player.play();
+ }
+ }); // Load new source
+
+ player.media.load();
+ } // Trigger change event
+
+
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
+ quality: input
+ }); // Save to storage
+
+ player.storage.set({
+ quality: input
+ });
+ }
+ });
+ },
+ // Cancel current network requests
+ // See https://github.com/sampotts/plyr/issues/174
+ cancelRequests: function cancelRequests() {
+ if (!this.isHTML5) {
+ return;
+ } // Remove child sources
+
+
+ removeElement(html5.getSources.call(this)); // Set blank video src attribute
+ // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
+ // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
+
+ this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source
+ // This will cancel existing requests
+ // See https://github.com/sampotts/plyr/issues/174
+
+ this.media.load(); // Debugging
+
+ this.debug.log('Cancelled network requests');
+ }
+ };
+
+ // ==========================================================================
+
+ function dedupe(array) {
+ if (!is$1.array(array)) {
+ return array;
+ }
+
+ return array.filter(function (item, index) {
+ return array.indexOf(item) === index;
+ });
+ } // Get the closest value in an array
+
+ function closest(array, value) {
+ if (!is$1.array(array) || !array.length) {
+ return null;
+ }
+
+ return array.reduce(function (prev, curr) {
+ return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
+ });
+ }
+
+ function cloneDeep(object) {
+ return JSON.parse(JSON.stringify(object));
+ } // Get a nested value in an object
+
+ function getDeep(object, path) {
+ return path.split('.').reduce(function (obj, key) {
+ return obj && obj[key];
+ }, object);
+ } // Deep extend destination object with N more objects
+
+ function extend() {
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ sources[_key - 1] = arguments[_key];
+ }
+
+ if (!sources.length) {
+ return target;
+ }
+
+ var source = sources.shift();
+
+ if (!is$1.object(source)) {
+ return target;
+ }
+
+ Object.keys(source).forEach(function (key) {
+ if (is$1.object(source[key])) {
+ if (!Object.keys(target).includes(key)) {
+ Object.assign(target, _defineProperty({}, key, {}));
+ }
+
+ extend(target[key], source[key]);
+ } else {
+ Object.assign(target, _defineProperty({}, key, source[key]));
+ }
+ });
+ return extend.apply(void 0, [target].concat(sources));
+ }
+
+ var dP$2 = _objectDp.f;
+ var gOPN$1 = _objectGopn.f;
+
+
+ var $RegExp = _global.RegExp;
+ var Base$1 = $RegExp;
+ var proto$2 = $RegExp.prototype;
+ var re1 = /a/g;
+ var re2 = /a/g;
+ // "new" creates a new object, old webkit buggy here
+ var CORRECT_NEW = new $RegExp(re1) !== re1;
+
+ if (_descriptors && (!CORRECT_NEW || _fails(function () {
+ re2[_wks('match')] = false;
+ // RegExp constructor can alter flags and IsRegExp works correct with @@match
+ return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';
+ }))) {
+ $RegExp = function RegExp(p, f) {
+ var tiRE = this instanceof $RegExp;
+ var piRE = _isRegexp(p);
+ var fiU = f === undefined;
+ return !tiRE && piRE && p.constructor === $RegExp && fiU ? p
+ : _inheritIfRequired(CORRECT_NEW
+ ? new Base$1(piRE && !fiU ? p.source : p, f)
+ : Base$1((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? _flags.call(p) : f)
+ , tiRE ? this : proto$2, $RegExp);
+ };
+ var proxy = function (key) {
+ key in $RegExp || dP$2($RegExp, key, {
+ configurable: true,
+ get: function () { return Base$1[key]; },
+ set: function (it) { Base$1[key] = it; }
+ });
+ };
+ for (var keys$1 = gOPN$1(Base$1), i$1 = 0; keys$1.length > i$1;) proxy(keys$1[i$1++]);
+ proto$2.constructor = $RegExp;
+ $RegExp.prototype = proto$2;
+ _redefine(_global, 'RegExp', $RegExp);
+ }
+
+ _setSpecies('RegExp');
+
+ function generateId(prefix) {
+ return "".concat(prefix, "-").concat(Math.floor(Math.random() * 10000));
+ } // Format string
+
+ function format(input) {
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ if (is$1.empty(input)) {
+ return input;
+ }
+
+ return input.toString().replace(/{(\d+)}/g, function (match, i) {
+ return args[i].toString();
+ });
+ } // Get percentage
+
+ function getPercentage(current, max) {
+ if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
+ return 0;
+ }
+
+ return (current / max * 100).toFixed(2);
+ } // Replace all occurances of a string in a string
+
+ function replaceAll() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
+ return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
+ } // Convert to title case
+
+ function toTitleCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ return input.toString().replace(/\w\S*/g, function (text) {
+ return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
+ });
+ } // Convert string to pascalCase
+
+ function toPascalCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var string = input.toString(); // Convert kebab case
+
+ string = replaceAll(string, '-', ' '); // Convert snake case
+
+ string = replaceAll(string, '_', ' '); // Convert to title case
+
+ string = toTitleCase(string); // Convert to pascal case
+
+ return replaceAll(string, ' ', '');
+ } // Convert string to pascalCase
+
+ function toCamelCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var string = input.toString(); // Convert to pascal case
+
+ string = toPascalCase(string); // Convert first character to lowercase
+
+ return string.charAt(0).toLowerCase() + string.slice(1);
+ } // Remove HTML from a string
+
+ function stripHTML(source) {
+ var fragment = document.createDocumentFragment();
+ var element = document.createElement('div');
+ fragment.appendChild(element);
+ element.innerHTML = source;
+ return fragment.firstChild.innerText;
+ } // Like outerHTML, but also works for DocumentFragment
+
+ function getHTML(element) {
+ var wrapper = document.createElement('div');
+ wrapper.appendChild(element);
+ return wrapper.innerHTML;
+ }
+
+ var i18n = {
+ get: function get() {
+ var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (is$1.empty(key) || is$1.empty(config)) {
+ return '';
+ }
+
+ var string = getDeep(config.i18n, key);
+
+ if (is$1.empty(string)) {
+ return '';
+ }
+
+ var replace = {
+ '{seektime}': config.seekTime,
+ '{title}': config.title
+ };
+ Object.entries(replace).forEach(function (_ref) {
+ var _ref2 = _slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
+
+ string = replaceAll(string, key, value);
+ });
+ return string;
+ }
+ };
+
+ var Storage =
+ /*#__PURE__*/
+ function () {
+ function Storage(player) {
+ _classCallCheck(this, Storage);
+
+ this.enabled = player.config.storage.enabled;
+ this.key = player.config.storage.key;
+ } // Check for actual support (see if we can use it)
+
+
+ _createClass(Storage, [{
+ key: "get",
+ value: function get(key) {
+ if (!Storage.supported || !this.enabled) {
+ return null;
+ }
+
+ var store = window.localStorage.getItem(this.key);
+
+ if (is$1.empty(store)) {
+ return null;
+ }
+
+ var json = JSON.parse(store);
+ return is$1.string(key) && key.length ? json[key] : json;
+ }
+ }, {
+ key: "set",
+ value: function set(object) {
+ // Bail if we don't have localStorage support or it's disabled
+ if (!Storage.supported || !this.enabled) {
+ return;
+ } // Can only store objectst
+
+
+ if (!is$1.object(object)) {
+ return;
+ } // Get current storage
+
+
+ var storage = this.get(); // Default to empty object
+
+ if (is$1.empty(storage)) {
+ storage = {};
+ } // Update the working copy of the values
+
+
+ extend(storage, object); // Update storage
+
+ window.localStorage.setItem(this.key, JSON.stringify(storage));
+ }
+ }], [{
+ key: "supported",
+ get: function get() {
+ try {
+ if (!('localStorage' in window)) {
+ return false;
+ }
+
+ var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)
+ // see: https://github.com/sampotts/plyr/issues/131
+
+ window.localStorage.setItem(test, test);
+ window.localStorage.removeItem(test);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+ }]);
+
+ return Storage;
+ }();
+
+ // ==========================================================================
+ // Fetch wrapper
+ // Using XHR to avoid issues with older browsers
+ // ==========================================================================
+ function fetch(url) {
+ var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
+ return new Promise(function (resolve, reject) {
+ try {
+ var request = new XMLHttpRequest(); // Check for CORS support
+
+ if (!('withCredentials' in request)) {
+ return;
+ }
+
+ request.addEventListener('load', function () {
+ if (responseType === 'text') {
+ try {
+ resolve(JSON.parse(request.responseText));
+ } catch (e) {
+ resolve(request.responseText);
+ }
+ } else {
+ resolve(request.response);
+ }
+ });
+ request.addEventListener('error', function () {
+ throw new Error(request.status);
+ });
+ request.open('GET', url, true); // Set the required response type
+
+ request.responseType = responseType;
+ request.send();
+ } catch (e) {
+ reject(e);
+ }
+ });
+ }
+
+ // ==========================================================================
+
+ function loadSprite(url, id) {
+ if (!is$1.string(url)) {
+ return;
+ }
+
+ var prefix = 'cache';
+ var hasId = is$1.string(id);
+ var isCached = false;
+
+ var exists = function exists() {
+ return document.getElementById(id) !== null;
+ };
+
+ var update = function update(container, data) {
+ container.innerHTML = data; // Check again incase of race condition
+
+ if (hasId && exists()) {
+ return;
+ } // Inject the SVG to the body
+
+
+ document.body.insertAdjacentElement('afterbegin', container);
+ }; // Only load once if ID set
+
+
+ if (!hasId || !exists()) {
+ var useStorage = Storage.supported; // Create container
+
+ var container = document.createElement('div');
+ container.setAttribute('hidden', '');
+
+ if (hasId) {
+ container.setAttribute('id', id);
+ } // Check in cache
+
+
+ if (useStorage) {
+ var cached = window.localStorage.getItem("".concat(prefix, "-").concat(id));
+ isCached = cached !== null;
+
+ if (isCached) {
+ var data = JSON.parse(cached);
+ update(container, data.content);
+ }
+ } // Get the sprite
+
+
+ fetch(url).then(function (result) {
+ if (is$1.empty(result)) {
+ return;
+ }
+
+ if (useStorage) {
+ window.localStorage.setItem("".concat(prefix, "-").concat(id), JSON.stringify({
+ content: result
+ }));
+ }
+
+ update(container, result);
+ }).catch(function () {});
+ }
+ }
+
+ // ==========================================================================
+
+ var getHours = function getHours(value) {
+ return parseInt(value / 60 / 60 % 60, 10);
+ };
+ var getMinutes = function getMinutes(value) {
+ return parseInt(value / 60 % 60, 10);
+ };
+ var getSeconds = function getSeconds(value) {
+ return parseInt(value % 60, 10);
+ }; // Format time to UI friendly string
+
+ function formatTime() {
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ // Bail if the value isn't a number
+ if (!is$1.number(time)) {
+ return formatTime(null, displayHours, inverted);
+ } // Format time component to add leading zero
+
+
+ var format = function format(value) {
+ return "0".concat(value).slice(-2);
+ }; // Breakdown to hours, mins, secs
+
+
+ var hours = getHours(time);
+ var mins = getMinutes(time);
+ var secs = getSeconds(time); // Do we need to display hours?
+
+ if (displayHours || hours > 0) {
+ hours = "".concat(hours, ":");
+ } else {
+ hours = '';
+ } // Render
+
+
+ return "".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), ":").concat(format(secs));
+ }
+
+ var controls = {
+ // Get icon URL
+ getIconUrl: function getIconUrl() {
+ var url = new URL(this.config.iconUrl, window.location);
+ var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
+ return {
+ url: this.config.iconUrl,
+ cors: cors
+ };
+ },
+ // Find the UI controls
+ findElements: function findElements() {
+ try {
+ this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons
+
+ this.elements.buttons = {
+ play: getElements.call(this, this.config.selectors.buttons.play),
+ pause: getElement.call(this, this.config.selectors.buttons.pause),
+ restart: getElement.call(this, this.config.selectors.buttons.restart),
+ rewind: getElement.call(this, this.config.selectors.buttons.rewind),
+ fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
+ mute: getElement.call(this, this.config.selectors.buttons.mute),
+ pip: getElement.call(this, this.config.selectors.buttons.pip),
+ airplay: getElement.call(this, this.config.selectors.buttons.airplay),
+ settings: getElement.call(this, this.config.selectors.buttons.settings),
+ captions: getElement.call(this, this.config.selectors.buttons.captions),
+ fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)
+ }; // Progress
+
+ this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs
+
+ this.elements.inputs = {
+ seek: getElement.call(this, this.config.selectors.inputs.seek),
+ volume: getElement.call(this, this.config.selectors.inputs.volume)
+ }; // Display
+
+ this.elements.display = {
+ buffer: getElement.call(this, this.config.selectors.display.buffer),
+ currentTime: getElement.call(this, this.config.selectors.display.currentTime),
+ duration: getElement.call(this, this.config.selectors.display.duration)
+ }; // Seek tooltip
+
+ if (is$1.element(this.elements.progress)) {
+ this.elements.display.seekTooltip = this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip));
+ }
+
+ return true;
+ } catch (error) {
+ // Log it
+ this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls
+
+ this.toggleNativeControls(true);
+ return false;
+ }
+ },
+ // Create <svg> icon
+ createIcon: function createIcon(type, attributes) {
+ var namespace = 'http://www.w3.org/2000/svg';
+ var iconUrl = controls.getIconUrl.call(this);
+ var iconPath = "".concat(!iconUrl.cors ? iconUrl.url : '', "#").concat(this.config.iconPrefix); // Create <svg>
+
+ var icon = document.createElementNS(namespace, 'svg');
+ setAttributes(icon, extend(attributes, {
+ role: 'presentation',
+ focusable: 'false'
+ })); // Create the <use> to reference sprite
+
+ var use = document.createElementNS(namespace, 'use');
+ var path = "".concat(iconPath, "-").concat(type); // Set `href` attributes
+ // https://github.com/sampotts/plyr/issues/460
+ // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
+
+ if ('href' in use) {
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
+ } else {
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);
+ } // Add <use> to <svg>
+
+
+ icon.appendChild(use);
+ return icon;
+ },
+ // Create hidden text label
+ createLabel: function createLabel(type) {
+ var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ // Skip i18n for abbreviations and brand names
+ var universals = {
+ pip: 'PIP',
+ airplay: 'AirPlay'
+ };
+ var text = universals[type] || i18n.get(type, this.config);
+ var attributes = Object.assign({}, attr, {
+ class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')
+ });
+ return createElement('span', attributes, text);
+ },
+ // Create a badge
+ createBadge: function createBadge(text) {
+ if (is$1.empty(text)) {
+ return null;
+ }
+
+ var badge = createElement('span', {
+ class: this.config.classNames.menu.value
+ });
+ badge.appendChild(createElement('span', {
+ class: this.config.classNames.menu.badge
+ }, text));
+ return badge;
+ },
+ // Create a <button>
+ createButton: function createButton(buttonType, attr) {
+ var button = createElement('button');
+ var attributes = Object.assign({}, attr);
+ var type = toCamelCase(buttonType);
+ var toggle = false;
+ var label;
+ var icon;
+ var labelPressed;
+ var iconPressed;
+
+ if (!('type' in attributes)) {
+ attributes.type = 'button';
+ }
+
+ if ('class' in attributes) {
+ if (!attributes.class.includes(this.config.classNames.control)) {
+ attributes.class += " ".concat(this.config.classNames.control);
+ }
+ } else {
+ attributes.class = this.config.classNames.control;
+ } // Large play button
+
+
+ switch (buttonType) {
+ case 'play':
+ toggle = true;
+ label = 'play';
+ labelPressed = 'pause';
+ icon = 'play';
+ iconPressed = 'pause';
+ break;
+
+ case 'mute':
+ toggle = true;
+ label = 'mute';
+ labelPressed = 'unmute';
+ icon = 'volume';
+ iconPressed = 'muted';
+ break;
+
+ case 'captions':
+ toggle = true;
+ label = 'enableCaptions';
+ labelPressed = 'disableCaptions';
+ icon = 'captions-off';
+ iconPressed = 'captions-on';
+ break;
+
+ case 'fullscreen':
+ toggle = true;
+ label = 'enterFullscreen';
+ labelPressed = 'exitFullscreen';
+ icon = 'enter-fullscreen';
+ iconPressed = 'exit-fullscreen';
+ break;
+
+ case 'play-large':
+ attributes.class += " ".concat(this.config.classNames.control, "--overlaid");
+ type = 'play';
+ label = 'play';
+ icon = 'play';
+ break;
+
+ default:
+ label = type;
+ icon = buttonType;
+ } // Setup toggle icon and labels
+
+
+ if (toggle) {
+ // Icon
+ button.appendChild(controls.createIcon.call(this, iconPressed, {
+ class: 'icon--pressed'
+ }));
+ button.appendChild(controls.createIcon.call(this, icon, {
+ class: 'icon--not-pressed'
+ })); // Label/Tooltip
+
+ button.appendChild(controls.createLabel.call(this, labelPressed, {
+ class: 'label--pressed'
+ }));
+ button.appendChild(controls.createLabel.call(this, label, {
+ class: 'label--not-pressed'
+ }));
+ } else {
+ button.appendChild(controls.createIcon.call(this, icon));
+ button.appendChild(controls.createLabel.call(this, label));
+ } // Merge attributes
+
+
+ extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
+ setAttributes(button, attributes); // We have multiple play buttons
+
+ if (type === 'play') {
+ if (!is$1.array(this.elements.buttons[type])) {
+ this.elements.buttons[type] = [];
+ }
+
+ this.elements.buttons[type].push(button);
+ } else {
+ this.elements.buttons[type] = button;
+ }
+
+ return button;
+ },
+ // Create an <input type='range'>
+ createRange: function createRange(type, attributes) {
+ // Seek input
+ var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
+ type: 'range',
+ min: 0,
+ max: 100,
+ step: 0.01,
+ value: 0,
+ autocomplete: 'off',
+ // A11y fixes for https://github.com/sampotts/plyr/issues/905
+ role: 'slider',
+ 'aria-label': i18n.get(type, this.config),
+ 'aria-valuemin': 0,
+ 'aria-valuemax': 100,
+ 'aria-valuenow': 0
+ }, attributes));
+ this.elements.inputs[type] = input; // Set the fill for webkit now
+
+ controls.updateRangeFill.call(this, input);
+ return input;
+ },
+ // Create a <progress>
+ createProgress: function createProgress(type, attributes) {
+ var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {
+ min: 0,
+ max: 100,
+ value: 0,
+ role: 'presentation',
+ 'aria-hidden': true
+ }, attributes)); // Create the label inside
+
+ if (type !== 'volume') {
+ progress.appendChild(createElement('span', null, '0'));
+ var suffixKey = {
+ played: 'played',
+ buffer: 'buffered'
+ }[type];
+ var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
+ progress.innerText = "% ".concat(suffix.toLowerCase());
+ }
+
+ this.elements.display[type] = progress;
+ return progress;
+ },
+ // Create time display
+ createTime: function createTime(type) {
+ var attributes = getAttributesFromSelector(this.config.selectors.display[type]);
+ var container = createElement('div', extend(attributes, {
+ class: "".concat(this.config.classNames.display.time, " ").concat(attributes.class ? attributes.class : '').trim(),
+ 'aria-label': i18n.get(type, this.config)
+ }), '00:00'); // Reference for updates
+
+ this.elements.display[type] = container;
+ return container;
+ },
+ // Bind keyboard shortcuts for a menu item
+ // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
+ bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {
+ var _this = this;
+
+ // Navigate through menus via arrow keys and space
+ on(menuItem, 'keydown keyup', function (event) {
+ // We only care about space and ⬆️ ⬇️️ ➡️
+ if (![32, 38, 39, 40].includes(event.which)) {
+ return;
+ } // Prevent play / seek
+
+
+ event.preventDefault();
+ event.stopPropagation(); // We're just here to prevent the keydown bubbling
+
+ if (event.type === 'keydown') {
+ return;
+ }
+
+ var isRadioButton = matches(menuItem, '[role="menuitemradio"]'); // Show the respective menu
+
+ if (!isRadioButton && [32, 39].includes(event.which)) {
+ controls.showMenuPanel.call(_this, type, true);
+ } else {
+ var target;
+
+ if (event.which !== 32) {
+ if (event.which === 40 || isRadioButton && event.which === 39) {
+ target = menuItem.nextElementSibling;
+
+ if (!is$1.element(target)) {
+ target = menuItem.parentNode.firstElementChild;
+ }
+ } else {
+ target = menuItem.previousElementSibling;
+
+ if (!is$1.element(target)) {
+ target = menuItem.parentNode.lastElementChild;
+ }
+ }
+
+ setFocus.call(_this, target, true);
+ }
+ }
+ }, false); // Enter will fire a `click` event but we still need to manage focus
+ // So we bind to keyup which fires after and set focus here
+
+ on(menuItem, 'keyup', function (event) {
+ if (event.which !== 13) {
+ return;
+ }
+
+ controls.focusFirstMenuItem.call(_this, null, true);
+ });
+ },
+ // Create a settings menu item
+ createMenuItem: function createMenuItem(_ref) {
+ var _this2 = this;
+
+ var value = _ref.value,
+ list = _ref.list,
+ type = _ref.type,
+ title = _ref.title,
+ _ref$badge = _ref.badge,
+ badge = _ref$badge === void 0 ? null : _ref$badge,
+ _ref$checked = _ref.checked,
+ checked = _ref$checked === void 0 ? false : _ref$checked;
+ var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);
+ var menuItem = createElement('button', extend(attributes, {
+ type: 'button',
+ role: 'menuitemradio',
+ class: "".concat(this.config.classNames.control, " ").concat(attributes.class ? attributes.class : '').trim(),
+ 'aria-checked': checked,
+ value: value
+ }));
+ var flex = createElement('span'); // We have to set as HTML incase of special characters
+
+ flex.innerHTML = title;
+
+ if (is$1.element(badge)) {
+ flex.appendChild(badge);
+ }
+
+ menuItem.appendChild(flex); // Replicate radio button behaviour
+
+ Object.defineProperty(menuItem, 'checked', {
+ enumerable: true,
+ get: function get() {
+ return menuItem.getAttribute('aria-checked') === 'true';
+ },
+ set: function set(checked) {
+ // Ensure exclusivity
+ if (checked) {
+ Array.from(menuItem.parentNode.children).filter(function (node) {
+ return matches(node, '[role="menuitemradio"]');
+ }).forEach(function (node) {
+ return node.setAttribute('aria-checked', 'false');
+ });
+ }
+
+ menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');
+ }
+ });
+ this.listeners.bind(menuItem, 'click keyup', function (event) {
+ if (is$1.keyboardEvent(event) && event.which !== 32) {
+ return;
+ }
+
+ event.preventDefault();
+ event.stopPropagation();
+ menuItem.checked = true;
+
+ switch (type) {
+ case 'language':
+ _this2.currentTrack = Number(value);
+ break;
+
+ case 'quality':
+ _this2.quality = value;
+ break;
+
+ case 'speed':
+ _this2.speed = parseFloat(value);
+ break;
+
+ default:
+ break;
+ }
+
+ controls.showMenuPanel.call(_this2, 'home', is$1.keyboardEvent(event));
+ }, type, false);
+ controls.bindMenuItemShortcuts.call(this, menuItem, type);
+ list.appendChild(menuItem);
+ },
+ // Format a time for display
+ formatTime: function formatTime$$1() {
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ // Bail if the value isn't a number
+ if (!is$1.number(time)) {
+ return time;
+ } // Always display hours if duration is over an hour
+
+
+ var forceHours = getHours(this.duration) > 0;
+ return formatTime(time, forceHours, inverted);
+ },
+ // Update the displayed time
+ updateTimeDisplay: function updateTimeDisplay() {
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ // Bail if there's no element to display or the value isn't a number
+ if (!is$1.element(target) || !is$1.number(time)) {
+ return;
+ } // eslint-disable-next-line no-param-reassign
+
+
+ target.innerText = controls.formatTime(time, inverted);
+ },
+ // Update volume UI and storage
+ updateVolume: function updateVolume() {
+ if (!this.supported.ui) {
+ return;
+ } // Update range
+
+
+ if (is$1.element(this.elements.inputs.volume)) {
+ controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
+ } // Update mute state
+
+
+ if (is$1.element(this.elements.buttons.mute)) {
+ this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
+ }
+ },
+ // Update seek value and lower fill
+ setRange: function setRange(target) {
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+
+ if (!is$1.element(target)) {
+ return;
+ } // eslint-disable-next-line
+
+
+ target.value = value; // Webkit range fill
+
+ controls.updateRangeFill.call(this, target);
+ },
+ // Update <progress> elements
+ updateProgress: function updateProgress(event) {
+ var _this3 = this;
+
+ if (!this.supported.ui || !is$1.event(event)) {
+ return;
+ }
+
+ var value = 0;
+
+ var setProgress = function setProgress(target, input) {
+ var value = is$1.number(input) ? input : 0;
+ var progress = is$1.element(target) ? target : _this3.elements.display.buffer; // Update value and label
+
+ if (is$1.element(progress)) {
+ progress.value = value; // Update text label inside
+
+ var label = progress.getElementsByTagName('span')[0];
+
+ if (is$1.element(label)) {
+ label.childNodes[0].nodeValue = value;
+ }
+ }
+ };
+
+ if (event) {
+ switch (event.type) {
+ // Video playing
+ case 'timeupdate':
+ case 'seeking':
+ case 'seeked':
+ value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event
+
+ if (event.type === 'timeupdate') {
+ controls.setRange.call(this, this.elements.inputs.seek, value);
+ }
+
+ break;
+ // Check buffer status
+
+ case 'playing':
+ case 'progress':
+ setProgress(this.elements.display.buffer, this.buffered * 100);
+ break;
- var _shared = createCommonjsModule(function (module) {
- var SHARED = '__core-js_shared__';
- var store = _global[SHARED] || (_global[SHARED] = {});
+ default:
+ break;
+ }
+ }
+ },
+ // Webkit polyfill for lower fill range
+ updateRangeFill: function updateRangeFill(target) {
+ // Get range from event if event passed
+ var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>
+
+ if (!is$1.element(range) || range.getAttribute('type') !== 'range') {
+ return;
+ } // Set aria values for https://github.com/sampotts/plyr/issues/905
+
+
+ if (matches(range, this.config.selectors.inputs.seek)) {
+ range.setAttribute('aria-valuenow', this.currentTime);
+ var currentTime = controls.formatTime(this.currentTime);
+ var duration = controls.formatTime(this.duration);
+ var format$$1 = i18n.get('seekLabel', this.config);
+ range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
+ } else if (matches(range, this.config.selectors.inputs.volume)) {
+ var percent = range.value * 100;
+ range.setAttribute('aria-valuenow', percent);
+ range.setAttribute('aria-valuetext', "".concat(percent.toFixed(1), "%"));
+ } else {
+ range.setAttribute('aria-valuenow', range.value);
+ } // WebKit only
- (module.exports = function (key, value) {
- return store[key] || (store[key] = value !== undefined ? value : {});
- })('versions', []).push({
- version: _core.version,
- mode: 'global',
- copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
- });
- });
- var shared = _shared('keys');
+ if (!browser.isWebkit) {
+ return;
+ } // Set CSS custom property
- var _sharedKey = function (key) {
- return shared[key] || (shared[key] = _uid(key));
- };
- var arrayIndexOf = _arrayIncludes(false);
- var IE_PROTO = _sharedKey('IE_PROTO');
+ range.style.setProperty('--value', "".concat(range.value / range.max * 100, "%"));
+ },
+ // Update hover tooltip for seeking
+ updateSeekTooltip: function updateSeekTooltip(event) {
+ var _this4 = this;
- var _objectKeysInternal = function (object, names) {
- var O = _toIobject(object);
- var i = 0;
- var result = [];
- var key;
- for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key);
- // Don't enum bug & hidden keys
- while (names.length > i) if (_has(O, key = names[i++])) {
- ~arrayIndexOf(result, key) || result.push(key);
- }
- return result;
- };
+ // Bail if setting not true
+ if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {
+ return;
+ } // Calculate percentage
- // IE 8- don't enum bug keys
- var _enumBugKeys = (
- 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
- ).split(',');
-
- // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
-
- var hiddenKeys = _enumBugKeys.concat('length', 'prototype');
-
- var f$1 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
- return _objectKeysInternal(O, hiddenKeys);
- };
-
- var _objectGopn = {
- f: f$1
- };
-
- // 7.1.13 ToObject(argument)
-
- var _toObject = function (it) {
- return Object(_defined(it));
- };
-
- var _arrayFill = function fill(value /* , start = 0, end = @length */) {
- var O = _toObject(this);
- var length = _toLength(O.length);
- var aLen = arguments.length;
- var index = _toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);
- var end = aLen > 2 ? arguments[2] : undefined;
- var endPos = end === undefined ? length : _toAbsoluteIndex(end, length);
- while (endPos > index) O[index++] = value;
- return O;
- };
-
- var _wks = createCommonjsModule(function (module) {
- var store = _shared('wks');
-
- var Symbol = _global.Symbol;
- var USE_SYMBOL = typeof Symbol == 'function';
-
- var $exports = module.exports = function (name) {
- return store[name] || (store[name] =
- USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));
- };
-
- $exports.store = store;
- });
-
- var def = _objectDp.f;
-
- var TAG = _wks('toStringTag');
-
- var _setToStringTag = function (it, tag, stat) {
- if (it && !_has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
- };
-
- var _typedBuffer = createCommonjsModule(function (module, exports) {
-
-
-
-
-
-
-
-
-
-
-
- var gOPN = _objectGopn.f;
- var dP = _objectDp.f;
-
-
- var ARRAY_BUFFER = 'ArrayBuffer';
- var DATA_VIEW = 'DataView';
- var PROTOTYPE = 'prototype';
- var WRONG_LENGTH = 'Wrong length!';
- var WRONG_INDEX = 'Wrong index!';
- var $ArrayBuffer = _global[ARRAY_BUFFER];
- var $DataView = _global[DATA_VIEW];
- var Math = _global.Math;
- var RangeError = _global.RangeError;
- // eslint-disable-next-line no-shadow-restricted-names
- var Infinity = _global.Infinity;
- var BaseBuffer = $ArrayBuffer;
- var abs = Math.abs;
- var pow = Math.pow;
- var floor = Math.floor;
- var log = Math.log;
- var LN2 = Math.LN2;
- var BUFFER = 'buffer';
- var BYTE_LENGTH = 'byteLength';
- var BYTE_OFFSET = 'byteOffset';
- var $BUFFER = _descriptors ? '_b' : BUFFER;
- var $LENGTH = _descriptors ? '_l' : BYTE_LENGTH;
- var $OFFSET = _descriptors ? '_o' : BYTE_OFFSET;
-
- // IEEE754 conversions based on https://github.com/feross/ieee754
- function packIEEE754(value, mLen, nBytes) {
- var buffer = new Array(nBytes);
- var eLen = nBytes * 8 - mLen - 1;
- var eMax = (1 << eLen) - 1;
- var eBias = eMax >> 1;
- var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;
- var i = 0;
- var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
- var e, m, c;
- value = abs(value);
- // eslint-disable-next-line no-self-compare
- if (value != value || value === Infinity) {
- // eslint-disable-next-line no-self-compare
- m = value != value ? 1 : 0;
- e = eMax;
- } else {
- e = floor(log(value) / LN2);
- if (value * (c = pow(2, -e)) < 1) {
- e--;
- c *= 2;
- }
- if (e + eBias >= 1) {
- value += rt / c;
- } else {
- value += rt * pow(2, 1 - eBias);
- }
- if (value * c >= 2) {
- e++;
- c /= 2;
- }
- if (e + eBias >= eMax) {
- m = 0;
- e = eMax;
- } else if (e + eBias >= 1) {
- m = (value * c - 1) * pow(2, mLen);
- e = e + eBias;
- } else {
- m = value * pow(2, eBias - 1) * pow(2, mLen);
- e = 0;
- }
- }
- for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);
- e = e << mLen | m;
- eLen += mLen;
- for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);
- buffer[--i] |= s * 128;
- return buffer;
- }
- function unpackIEEE754(buffer, mLen, nBytes) {
- var eLen = nBytes * 8 - mLen - 1;
- var eMax = (1 << eLen) - 1;
- var eBias = eMax >> 1;
- var nBits = eLen - 7;
- var i = nBytes - 1;
- var s = buffer[i--];
- var e = s & 127;
- var m;
- s >>= 7;
- for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);
- m = e & (1 << -nBits) - 1;
- e >>= -nBits;
- nBits += mLen;
- for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);
- if (e === 0) {
- e = 1 - eBias;
- } else if (e === eMax) {
- return m ? NaN : s ? -Infinity : Infinity;
- } else {
- m = m + pow(2, mLen);
- e = e - eBias;
- } return (s ? -1 : 1) * m * pow(2, e - mLen);
- }
-
- function unpackI32(bytes) {
- return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
- }
- function packI8(it) {
- return [it & 0xff];
- }
- function packI16(it) {
- return [it & 0xff, it >> 8 & 0xff];
- }
- function packI32(it) {
- return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];
- }
- function packF64(it) {
- return packIEEE754(it, 52, 8);
- }
- function packF32(it) {
- return packIEEE754(it, 23, 4);
- }
-
- function addGetter(C, key, internal) {
- dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });
- }
-
- function get(view, bytes, index, isLittleEndian) {
- var numIndex = +index;
- var intIndex = _toIndex(numIndex);
- if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
- var store = view[$BUFFER]._b;
- var start = intIndex + view[$OFFSET];
- var pack = store.slice(start, start + bytes);
- return isLittleEndian ? pack : pack.reverse();
- }
- function set(view, bytes, index, conversion, value, isLittleEndian) {
- var numIndex = +index;
- var intIndex = _toIndex(numIndex);
- if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
- var store = view[$BUFFER]._b;
- var start = intIndex + view[$OFFSET];
- var pack = conversion(+value);
- for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];
- }
-
- if (!_typed.ABV) {
- $ArrayBuffer = function ArrayBuffer(length) {
- _anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
- var byteLength = _toIndex(length);
- this._b = _arrayFill.call(new Array(byteLength), 0);
- this[$LENGTH] = byteLength;
- };
-
- $DataView = function DataView(buffer, byteOffset, byteLength) {
- _anInstance(this, $DataView, DATA_VIEW);
- _anInstance(buffer, $ArrayBuffer, DATA_VIEW);
- var bufferLength = buffer[$LENGTH];
- var offset = _toInteger(byteOffset);
- if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');
- byteLength = byteLength === undefined ? bufferLength - offset : _toLength(byteLength);
- if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
- this[$BUFFER] = buffer;
- this[$OFFSET] = offset;
- this[$LENGTH] = byteLength;
- };
-
- if (_descriptors) {
- addGetter($ArrayBuffer, BYTE_LENGTH, '_l');
- addGetter($DataView, BUFFER, '_b');
- addGetter($DataView, BYTE_LENGTH, '_l');
- addGetter($DataView, BYTE_OFFSET, '_o');
- }
-
- _redefineAll($DataView[PROTOTYPE], {
- getInt8: function getInt8(byteOffset) {
- return get(this, 1, byteOffset)[0] << 24 >> 24;
- },
- getUint8: function getUint8(byteOffset) {
- return get(this, 1, byteOffset)[0];
- },
- getInt16: function getInt16(byteOffset /* , littleEndian */) {
- var bytes = get(this, 2, byteOffset, arguments[1]);
- return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
- },
- getUint16: function getUint16(byteOffset /* , littleEndian */) {
- var bytes = get(this, 2, byteOffset, arguments[1]);
- return bytes[1] << 8 | bytes[0];
- },
- getInt32: function getInt32(byteOffset /* , littleEndian */) {
- return unpackI32(get(this, 4, byteOffset, arguments[1]));
- },
- getUint32: function getUint32(byteOffset /* , littleEndian */) {
- return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;
- },
- getFloat32: function getFloat32(byteOffset /* , littleEndian */) {
- return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);
- },
- getFloat64: function getFloat64(byteOffset /* , littleEndian */) {
- return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);
- },
- setInt8: function setInt8(byteOffset, value) {
- set(this, 1, byteOffset, packI8, value);
- },
- setUint8: function setUint8(byteOffset, value) {
- set(this, 1, byteOffset, packI8, value);
- },
- setInt16: function setInt16(byteOffset, value /* , littleEndian */) {
- set(this, 2, byteOffset, packI16, value, arguments[2]);
- },
- setUint16: function setUint16(byteOffset, value /* , littleEndian */) {
- set(this, 2, byteOffset, packI16, value, arguments[2]);
- },
- setInt32: function setInt32(byteOffset, value /* , littleEndian */) {
- set(this, 4, byteOffset, packI32, value, arguments[2]);
- },
- setUint32: function setUint32(byteOffset, value /* , littleEndian */) {
- set(this, 4, byteOffset, packI32, value, arguments[2]);
- },
- setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {
- set(this, 4, byteOffset, packF32, value, arguments[2]);
- },
- setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {
- set(this, 8, byteOffset, packF64, value, arguments[2]);
- }
- });
- } else {
- if (!_fails(function () {
- $ArrayBuffer(1);
- }) || !_fails(function () {
- new $ArrayBuffer(-1); // eslint-disable-line no-new
- }) || _fails(function () {
- new $ArrayBuffer(); // eslint-disable-line no-new
- new $ArrayBuffer(1.5); // eslint-disable-line no-new
- new $ArrayBuffer(NaN); // eslint-disable-line no-new
- return $ArrayBuffer.name != ARRAY_BUFFER;
- })) {
- $ArrayBuffer = function ArrayBuffer(length) {
- _anInstance(this, $ArrayBuffer);
- return new BaseBuffer(_toIndex(length));
- };
- var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];
- for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {
- if (!((key = keys[j++]) in $ArrayBuffer)) _hide($ArrayBuffer, key, BaseBuffer[key]);
- }
- ArrayBufferProto.constructor = $ArrayBuffer;
- }
- // iOS Safari 7.x bug
- var view = new $DataView(new $ArrayBuffer(2));
- var $setInt8 = $DataView[PROTOTYPE].setInt8;
- view.setInt8(0, 2147483648);
- view.setInt8(1, 2147483649);
- if (view.getInt8(0) || !view.getInt8(1)) _redefineAll($DataView[PROTOTYPE], {
- setInt8: function setInt8(byteOffset, value) {
- $setInt8.call(this, byteOffset, value << 24 >> 24);
- },
- setUint8: function setUint8(byteOffset, value) {
- $setInt8.call(this, byteOffset, value << 24 >> 24);
- }
- }, true);
- }
- _setToStringTag($ArrayBuffer, ARRAY_BUFFER);
- _setToStringTag($DataView, DATA_VIEW);
- _hide($DataView[PROTOTYPE], _typed.VIEW, true);
- exports[ARRAY_BUFFER] = $ArrayBuffer;
- exports[DATA_VIEW] = $DataView;
- });
-
- // 7.3.20 SpeciesConstructor(O, defaultConstructor)
-
-
- var SPECIES = _wks('species');
- var _speciesConstructor = function (O, D) {
- var C = _anObject(O).constructor;
- var S;
- return C === undefined || (S = _anObject(C)[SPECIES]) == undefined ? D : _aFunction(S);
- };
-
- var SPECIES$1 = _wks('species');
-
- var _setSpecies = function (KEY) {
- var C = _global[KEY];
- if (_descriptors && C && !C[SPECIES$1]) _objectDp.f(C, SPECIES$1, {
- configurable: true,
- get: function () { return this; }
- });
- };
-
- var ArrayBuffer = _global.ArrayBuffer;
-
- var $ArrayBuffer = _typedBuffer.ArrayBuffer;
- var $DataView = _typedBuffer.DataView;
- var $isView = _typed.ABV && ArrayBuffer.isView;
- var $slice = $ArrayBuffer.prototype.slice;
- var VIEW$1 = _typed.VIEW;
- var ARRAY_BUFFER = 'ArrayBuffer';
-
- _export(_export.G + _export.W + _export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });
-
- _export(_export.S + _export.F * !_typed.CONSTR, ARRAY_BUFFER, {
- // 24.1.3.1 ArrayBuffer.isView(arg)
- isView: function isView(it) {
- return $isView && $isView(it) || _isObject(it) && VIEW$1 in it;
- }
- });
-
- _export(_export.P + _export.U + _export.F * _fails(function () {
- return !new $ArrayBuffer(2).slice(1, undefined).byteLength;
- }), ARRAY_BUFFER, {
- // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)
- slice: function slice(start, end) {
- if ($slice !== undefined && end === undefined) return $slice.call(_anObject(this), start); // FF fix
- var len = _anObject(this).byteLength;
- var first = _toAbsoluteIndex(start, len);
- var fin = _toAbsoluteIndex(end === undefined ? len : end, len);
- var result = new (_speciesConstructor(this, $ArrayBuffer))(_toLength(fin - first));
- var viewS = new $DataView(this);
- var viewT = new $DataView(result);
- var index = 0;
- while (first < fin) {
- viewT.setUint8(index++, viewS.getUint8(first++));
- } return result;
- }
- });
-
- _setSpecies(ARRAY_BUFFER);
-
- // getting tag from 19.1.3.6 Object.prototype.toString()
-
- var TAG$1 = _wks('toStringTag');
- // ES3 wrong here
- var ARG = _cof(function () { return arguments; }()) == 'Arguments';
-
- // fallback for IE11 Script Access Denied error
- var tryGet = function (it, key) {
- try {
- return it[key];
- } catch (e) { /* empty */ }
- };
-
- var _classof = function (it) {
- var O, T, B;
- return it === undefined ? 'Undefined' : it === null ? 'Null'
- // @@toStringTag case
- : typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T
- // builtinTag case
- : ARG ? _cof(O)
- // ES3 arguments fallback
- : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
- };
-
- var _iterators = {};
-
- // check on default Array iterator
-
- var ITERATOR = _wks('iterator');
- var ArrayProto = Array.prototype;
-
- var _isArrayIter = function (it) {
- return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR] === it);
- };
-
- // 19.1.2.14 / 15.2.3.14 Object.keys(O)
-
-
-
- var _objectKeys = Object.keys || function keys(O) {
- return _objectKeysInternal(O, _enumBugKeys);
- };
-
- var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
- _anObject(O);
- var keys = _objectKeys(Properties);
- var length = keys.length;
- var i = 0;
- var P;
- while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]);
- return O;
- };
-
- var document$2 = _global.document;
- var _html = document$2 && document$2.documentElement;
-
- // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
-
-
-
- var IE_PROTO$1 = _sharedKey('IE_PROTO');
- var Empty = function () { /* empty */ };
- var PROTOTYPE$1 = 'prototype';
-
- // Create object with fake `null` prototype: use iframe Object with cleared prototype
- var createDict = function () {
- // Thrash, waste and sodomy: IE GC bug
- var iframe = _domCreate('iframe');
- var i = _enumBugKeys.length;
- var lt = '<';
- var gt = '>';
- var iframeDocument;
- iframe.style.display = 'none';
- _html.appendChild(iframe);
- iframe.src = 'javascript:'; // eslint-disable-line no-script-url
- // createDict = iframe.contentWindow.Object;
- // html.removeChild(iframe);
- iframeDocument = iframe.contentWindow.document;
- iframeDocument.open();
- iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
- iframeDocument.close();
- createDict = iframeDocument.F;
- while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]];
- return createDict();
- };
-
- var _objectCreate = Object.create || function create(O, Properties) {
- var result;
- if (O !== null) {
- Empty[PROTOTYPE$1] = _anObject(O);
- result = new Empty();
- Empty[PROTOTYPE$1] = null;
- // add "__proto__" for Object.getPrototypeOf polyfill
- result[IE_PROTO$1] = O;
- } else result = createDict();
- return Properties === undefined ? result : _objectDps(result, Properties);
- };
-
- // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
-
-
- var IE_PROTO$2 = _sharedKey('IE_PROTO');
- var ObjectProto = Object.prototype;
-
- var _objectGpo = Object.getPrototypeOf || function (O) {
- O = _toObject(O);
- if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2];
- if (typeof O.constructor == 'function' && O instanceof O.constructor) {
- return O.constructor.prototype;
- } return O instanceof Object ? ObjectProto : null;
- };
-
- var ITERATOR$1 = _wks('iterator');
-
- var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
- if (it != undefined) return it[ITERATOR$1]
- || it['@@iterator']
- || _iterators[_classof(it)];
- };
-
- // 7.2.2 IsArray(argument)
-
- var _isArray = Array.isArray || function isArray(arg) {
- return _cof(arg) == 'Array';
- };
-
- var SPECIES$2 = _wks('species');
-
- var _arraySpeciesConstructor = function (original) {
- var C;
- if (_isArray(original)) {
- C = original.constructor;
- // cross-realm fallback
- if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined;
- if (_isObject(C)) {
- C = C[SPECIES$2];
- if (C === null) C = undefined;
- }
- } return C === undefined ? Array : C;
- };
-
- // 9.4.2.3 ArraySpeciesCreate(originalArray, length)
-
-
- var _arraySpeciesCreate = function (original, length) {
- return new (_arraySpeciesConstructor(original))(length);
- };
-
- // 0 -> Array#forEach
- // 1 -> Array#map
- // 2 -> Array#filter
- // 3 -> Array#some
- // 4 -> Array#every
- // 5 -> Array#find
- // 6 -> Array#findIndex
-
-
-
-
-
- var _arrayMethods = function (TYPE, $create) {
- var IS_MAP = TYPE == 1;
- var IS_FILTER = TYPE == 2;
- var IS_SOME = TYPE == 3;
- var IS_EVERY = TYPE == 4;
- var IS_FIND_INDEX = TYPE == 6;
- var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
- var create = $create || _arraySpeciesCreate;
- return function ($this, callbackfn, that) {
- var O = _toObject($this);
- var self = _iobject(O);
- var f = _ctx(callbackfn, that, 3);
- var length = _toLength(self.length);
- var index = 0;
- var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
- var val, res;
- for (;length > index; index++) if (NO_HOLES || index in self) {
- val = self[index];
- res = f(val, index, O);
- if (TYPE) {
- if (IS_MAP) result[index] = res; // map
- else if (res) switch (TYPE) {
- case 3: return true; // some
- case 5: return val; // find
- case 6: return index; // findIndex
- case 2: result.push(val); // filter
- } else if (IS_EVERY) return false; // every
- }
- }
- return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
- };
- };
-
- // 22.1.3.31 Array.prototype[@@unscopables]
- var UNSCOPABLES = _wks('unscopables');
- var ArrayProto$1 = Array.prototype;
- if (ArrayProto$1[UNSCOPABLES] == undefined) _hide(ArrayProto$1, UNSCOPABLES, {});
- var _addToUnscopables = function (key) {
- ArrayProto$1[UNSCOPABLES][key] = true;
- };
-
- var _iterStep = function (done, value) {
- return { value: value, done: !!done };
- };
-
- var IteratorPrototype = {};
-
- // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
- _hide(IteratorPrototype, _wks('iterator'), function () { return this; });
-
- var _iterCreate = function (Constructor, NAME, next) {
- Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) });
- _setToStringTag(Constructor, NAME + ' Iterator');
- };
-
- var ITERATOR$2 = _wks('iterator');
- var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
- var FF_ITERATOR = '@@iterator';
- var KEYS = 'keys';
- var VALUES = 'values';
-
- var returnThis = function () { return this; };
-
- var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
- _iterCreate(Constructor, NAME, next);
- var getMethod = function (kind) {
- if (!BUGGY && kind in proto) return proto[kind];
- switch (kind) {
- case KEYS: return function keys() { return new Constructor(this, kind); };
- case VALUES: return function values() { return new Constructor(this, kind); };
- } return function entries() { return new Constructor(this, kind); };
- };
- var TAG = NAME + ' Iterator';
- var DEF_VALUES = DEFAULT == VALUES;
- var VALUES_BUG = false;
- var proto = Base.prototype;
- var $native = proto[ITERATOR$2] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
- var $default = $native || getMethod(DEFAULT);
- var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
- var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
- var methods, key, IteratorPrototype;
- // Fix native
- if ($anyNative) {
- IteratorPrototype = _objectGpo($anyNative.call(new Base()));
- if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
- // Set @@toStringTag to native iterators
- _setToStringTag(IteratorPrototype, TAG, true);
- // fix for some old engines
- if (typeof IteratorPrototype[ITERATOR$2] != 'function') _hide(IteratorPrototype, ITERATOR$2, returnThis);
- }
- }
- // fix Array#{values, @@iterator}.name in V8 / FF
- if (DEF_VALUES && $native && $native.name !== VALUES) {
- VALUES_BUG = true;
- $default = function values() { return $native.call(this); };
- }
- // Define iterator
- if (BUGGY || VALUES_BUG || !proto[ITERATOR$2]) {
- _hide(proto, ITERATOR$2, $default);
- }
- // Plug for library
- _iterators[NAME] = $default;
- _iterators[TAG] = returnThis;
- if (DEFAULT) {
- methods = {
- values: DEF_VALUES ? $default : getMethod(VALUES),
- keys: IS_SET ? $default : getMethod(KEYS),
- entries: $entries
- };
- if (FORCED) for (key in methods) {
- if (!(key in proto)) _redefine(proto, key, methods[key]);
- } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);
- }
- return methods;
- };
-
- // 22.1.3.4 Array.prototype.entries()
- // 22.1.3.13 Array.prototype.keys()
- // 22.1.3.29 Array.prototype.values()
- // 22.1.3.30 Array.prototype[@@iterator]()
- var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {
- this._t = _toIobject(iterated); // target
- this._i = 0; // next index
- this._k = kind; // kind
- // 22.1.5.2.1 %ArrayIteratorPrototype%.next()
- }, function () {
- var O = this._t;
- var kind = this._k;
- var index = this._i++;
- if (!O || index >= O.length) {
- this._t = undefined;
- return _iterStep(1);
- }
- if (kind == 'keys') return _iterStep(0, index);
- if (kind == 'values') return _iterStep(0, O[index]);
- return _iterStep(0, [index, O[index]]);
- }, 'values');
-
- // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
- _iterators.Arguments = _iterators.Array;
-
- _addToUnscopables('keys');
- _addToUnscopables('values');
- _addToUnscopables('entries');
-
- var ITERATOR$3 = _wks('iterator');
- var SAFE_CLOSING = false;
-
- try {
- var riter = [7][ITERATOR$3]();
- riter['return'] = function () { SAFE_CLOSING = true; };
- } catch (e) { /* empty */ }
-
- var _iterDetect = function (exec, skipClosing) {
- if (!skipClosing && !SAFE_CLOSING) return false;
- var safe = false;
- try {
- var arr = [7];
- var iter = arr[ITERATOR$3]();
- iter.next = function () { return { done: safe = true }; };
- arr[ITERATOR$3] = function () { return iter; };
- exec(arr);
- } catch (e) { /* empty */ }
- return safe;
- };
-
- var _arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {
- var O = _toObject(this);
- var len = _toLength(O.length);
- var to = _toAbsoluteIndex(target, len);
- var from = _toAbsoluteIndex(start, len);
- var end = arguments.length > 2 ? arguments[2] : undefined;
- var count = Math.min((end === undefined ? len : _toAbsoluteIndex(end, len)) - from, len - to);
- var inc = 1;
- if (from < to && to < from + count) {
- inc = -1;
- from += count - 1;
- to += count - 1;
- }
- while (count-- > 0) {
- if (from in O) O[to] = O[from];
- else delete O[to];
- to += inc;
- from += inc;
- } return O;
- };
-
- var f$2 = {}.propertyIsEnumerable;
-
- var _objectPie = {
- f: f$2
- };
-
- var gOPD = Object.getOwnPropertyDescriptor;
-
- var f$3 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) {
- O = _toIobject(O);
- P = _toPrimitive(P, true);
- if (_ie8DomDefine) try {
- return gOPD(O, P);
- } catch (e) { /* empty */ }
- if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]);
- };
-
- var _objectGopd = {
- f: f$3
- };
-
- var _typedArray = createCommonjsModule(function (module) {
- if (_descriptors) {
- var global = _global;
- var fails = _fails;
- var $export = _export;
- var $typed = _typed;
- var $buffer = _typedBuffer;
- var ctx = _ctx;
- var anInstance = _anInstance;
- var propertyDesc = _propertyDesc;
- var hide = _hide;
- var redefineAll = _redefineAll;
- var toInteger = _toInteger;
- var toLength = _toLength;
- var toIndex = _toIndex;
- var toAbsoluteIndex = _toAbsoluteIndex;
- var toPrimitive = _toPrimitive;
- var has = _has;
- var classof = _classof;
- var isObject = _isObject;
- var toObject = _toObject;
- var isArrayIter = _isArrayIter;
- var create = _objectCreate;
- var getPrototypeOf = _objectGpo;
- var gOPN = _objectGopn.f;
- var getIterFn = core_getIteratorMethod;
- var uid = _uid;
- var wks = _wks;
- var createArrayMethod = _arrayMethods;
- var createArrayIncludes = _arrayIncludes;
- var speciesConstructor = _speciesConstructor;
- var ArrayIterators = es6_array_iterator;
- var Iterators = _iterators;
- var $iterDetect = _iterDetect;
- var setSpecies = _setSpecies;
- var arrayFill = _arrayFill;
- var arrayCopyWithin = _arrayCopyWithin;
- var $DP = _objectDp;
- var $GOPD = _objectGopd;
- var dP = $DP.f;
- var gOPD = $GOPD.f;
- var RangeError = global.RangeError;
- var TypeError = global.TypeError;
- var Uint8Array = global.Uint8Array;
- var ARRAY_BUFFER = 'ArrayBuffer';
- var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;
- var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
- var PROTOTYPE = 'prototype';
- var ArrayProto = Array[PROTOTYPE];
- var $ArrayBuffer = $buffer.ArrayBuffer;
- var $DataView = $buffer.DataView;
- var arrayForEach = createArrayMethod(0);
- var arrayFilter = createArrayMethod(2);
- var arraySome = createArrayMethod(3);
- var arrayEvery = createArrayMethod(4);
- var arrayFind = createArrayMethod(5);
- var arrayFindIndex = createArrayMethod(6);
- var arrayIncludes = createArrayIncludes(true);
- var arrayIndexOf = createArrayIncludes(false);
- var arrayValues = ArrayIterators.values;
- var arrayKeys = ArrayIterators.keys;
- var arrayEntries = ArrayIterators.entries;
- var arrayLastIndexOf = ArrayProto.lastIndexOf;
- var arrayReduce = ArrayProto.reduce;
- var arrayReduceRight = ArrayProto.reduceRight;
- var arrayJoin = ArrayProto.join;
- var arraySort = ArrayProto.sort;
- var arraySlice = ArrayProto.slice;
- var arrayToString = ArrayProto.toString;
- var arrayToLocaleString = ArrayProto.toLocaleString;
- var ITERATOR = wks('iterator');
- var TAG = wks('toStringTag');
- var TYPED_CONSTRUCTOR = uid('typed_constructor');
- var DEF_CONSTRUCTOR = uid('def_constructor');
- var ALL_CONSTRUCTORS = $typed.CONSTR;
- var TYPED_ARRAY = $typed.TYPED;
- var VIEW = $typed.VIEW;
- var WRONG_LENGTH = 'Wrong length!';
-
- var $map = createArrayMethod(1, function (O, length) {
- return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);
- });
-
- var LITTLE_ENDIAN = fails(function () {
- // eslint-disable-next-line no-undef
- return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
- });
-
- var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {
- new Uint8Array(1).set({});
- });
-
- var toOffset = function (it, BYTES) {
- var offset = toInteger(it);
- if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');
- return offset;
- };
-
- var validate = function (it) {
- if (isObject(it) && TYPED_ARRAY in it) return it;
- throw TypeError(it + ' is not a typed array!');
- };
-
- var allocate = function (C, length) {
- if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {
- throw TypeError('It is not a typed array constructor!');
- } return new C(length);
- };
-
- var speciesFromList = function (O, list) {
- return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);
- };
-
- var fromList = function (C, list) {
- var index = 0;
- var length = list.length;
- var result = allocate(C, length);
- while (length > index) result[index] = list[index++];
- return result;
- };
-
- var addGetter = function (it, key, internal) {
- dP(it, key, { get: function () { return this._d[internal]; } });
- };
-
- var $from = function from(source /* , mapfn, thisArg */) {
- var O = toObject(source);
- var aLen = arguments.length;
- var mapfn = aLen > 1 ? arguments[1] : undefined;
- var mapping = mapfn !== undefined;
- var iterFn = getIterFn(O);
- var i, length, values, result, step, iterator;
- if (iterFn != undefined && !isArrayIter(iterFn)) {
- for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {
- values.push(step.value);
- } O = values;
- }
- if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);
- for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {
- result[i] = mapping ? mapfn(O[i], i) : O[i];
- }
- return result;
- };
-
- var $of = function of(/* ...items */) {
- var index = 0;
- var length = arguments.length;
- var result = allocate(this, length);
- while (length > index) result[index] = arguments[index++];
- return result;
- };
-
- // iOS Safari 6.x fails here
- var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });
-
- var $toLocaleString = function toLocaleString() {
- return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);
- };
-
- var proto = {
- copyWithin: function copyWithin(target, start /* , end */) {
- return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
- },
- every: function every(callbackfn /* , thisArg */) {
- return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- },
- fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars
- return arrayFill.apply(validate(this), arguments);
- },
- filter: function filter(callbackfn /* , thisArg */) {
- return speciesFromList(this, arrayFilter(validate(this), callbackfn,
- arguments.length > 1 ? arguments[1] : undefined));
- },
- find: function find(predicate /* , thisArg */) {
- return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
- },
- findIndex: function findIndex(predicate /* , thisArg */) {
- return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
- },
- forEach: function forEach(callbackfn /* , thisArg */) {
- arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- },
- indexOf: function indexOf(searchElement /* , fromIndex */) {
- return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
- },
- includes: function includes(searchElement /* , fromIndex */) {
- return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
- },
- join: function join(separator) { // eslint-disable-line no-unused-vars
- return arrayJoin.apply(validate(this), arguments);
- },
- lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars
- return arrayLastIndexOf.apply(validate(this), arguments);
- },
- map: function map(mapfn /* , thisArg */) {
- return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);
- },
- reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars
- return arrayReduce.apply(validate(this), arguments);
- },
- reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars
- return arrayReduceRight.apply(validate(this), arguments);
- },
- reverse: function reverse() {
- var that = this;
- var length = validate(that).length;
- var middle = Math.floor(length / 2);
- var index = 0;
- var value;
- while (index < middle) {
- value = that[index];
- that[index++] = that[--length];
- that[length] = value;
- } return that;
- },
- some: function some(callbackfn /* , thisArg */) {
- return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- },
- sort: function sort(comparefn) {
- return arraySort.call(validate(this), comparefn);
- },
- subarray: function subarray(begin, end) {
- var O = validate(this);
- var length = O.length;
- var $begin = toAbsoluteIndex(begin, length);
- return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(
- O.buffer,
- O.byteOffset + $begin * O.BYTES_PER_ELEMENT,
- toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)
- );
- }
- };
-
- var $slice = function slice(start, end) {
- return speciesFromList(this, arraySlice.call(validate(this), start, end));
- };
-
- var $set = function set(arrayLike /* , offset */) {
- validate(this);
- var offset = toOffset(arguments[1], 1);
- var length = this.length;
- var src = toObject(arrayLike);
- var len = toLength(src.length);
- var index = 0;
- if (len + offset > length) throw RangeError(WRONG_LENGTH);
- while (index < len) this[offset + index] = src[index++];
- };
-
- var $iterators = {
- entries: function entries() {
- return arrayEntries.call(validate(this));
- },
- keys: function keys() {
- return arrayKeys.call(validate(this));
- },
- values: function values() {
- return arrayValues.call(validate(this));
- }
- };
-
- var isTAIndex = function (target, key) {
- return isObject(target)
- && target[TYPED_ARRAY]
- && typeof key != 'symbol'
- && key in target
- && String(+key) == String(key);
- };
- var $getDesc = function getOwnPropertyDescriptor(target, key) {
- return isTAIndex(target, key = toPrimitive(key, true))
- ? propertyDesc(2, target[key])
- : gOPD(target, key);
- };
- var $setDesc = function defineProperty(target, key, desc) {
- if (isTAIndex(target, key = toPrimitive(key, true))
- && isObject(desc)
- && has(desc, 'value')
- && !has(desc, 'get')
- && !has(desc, 'set')
- // TODO: add validation descriptor w/o calling accessors
- && !desc.configurable
- && (!has(desc, 'writable') || desc.writable)
- && (!has(desc, 'enumerable') || desc.enumerable)
- ) {
- target[key] = desc.value;
- return target;
- } return dP(target, key, desc);
- };
-
- if (!ALL_CONSTRUCTORS) {
- $GOPD.f = $getDesc;
- $DP.f = $setDesc;
- }
-
- $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {
- getOwnPropertyDescriptor: $getDesc,
- defineProperty: $setDesc
- });
-
- if (fails(function () { arrayToString.call({}); })) {
- arrayToString = arrayToLocaleString = function toString() {
- return arrayJoin.call(this);
- };
- }
-
- var $TypedArrayPrototype$ = redefineAll({}, proto);
- redefineAll($TypedArrayPrototype$, $iterators);
- hide($TypedArrayPrototype$, ITERATOR, $iterators.values);
- redefineAll($TypedArrayPrototype$, {
- slice: $slice,
- set: $set,
- constructor: function () { /* noop */ },
- toString: arrayToString,
- toLocaleString: $toLocaleString
- });
- addGetter($TypedArrayPrototype$, 'buffer', 'b');
- addGetter($TypedArrayPrototype$, 'byteOffset', 'o');
- addGetter($TypedArrayPrototype$, 'byteLength', 'l');
- addGetter($TypedArrayPrototype$, 'length', 'e');
- dP($TypedArrayPrototype$, TAG, {
- get: function () { return this[TYPED_ARRAY]; }
- });
-
- // eslint-disable-next-line max-statements
- module.exports = function (KEY, BYTES, wrapper, CLAMPED) {
- CLAMPED = !!CLAMPED;
- var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';
- var GETTER = 'get' + KEY;
- var SETTER = 'set' + KEY;
- var TypedArray = global[NAME];
- var Base = TypedArray || {};
- var TAC = TypedArray && getPrototypeOf(TypedArray);
- var FORCED = !TypedArray || !$typed.ABV;
- var O = {};
- var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];
- var getter = function (that, index) {
- var data = that._d;
- return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);
- };
- var setter = function (that, index, value) {
- var data = that._d;
- if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;
- data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);
- };
- var addElement = function (that, index) {
- dP(that, index, {
- get: function () {
- return getter(this, index);
- },
- set: function (value) {
- return setter(this, index, value);
- },
- enumerable: true
- });
- };
- if (FORCED) {
- TypedArray = wrapper(function (that, data, $offset, $length) {
- anInstance(that, TypedArray, NAME, '_d');
- var index = 0;
- var offset = 0;
- var buffer, byteLength, length, klass;
- if (!isObject(data)) {
- length = toIndex(data);
- byteLength = length * BYTES;
- buffer = new $ArrayBuffer(byteLength);
- } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
- buffer = data;
- offset = toOffset($offset, BYTES);
- var $len = data.byteLength;
- if ($length === undefined) {
- if ($len % BYTES) throw RangeError(WRONG_LENGTH);
- byteLength = $len - offset;
- if (byteLength < 0) throw RangeError(WRONG_LENGTH);
- } else {
- byteLength = toLength($length) * BYTES;
- if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);
- }
- length = byteLength / BYTES;
- } else if (TYPED_ARRAY in data) {
- return fromList(TypedArray, data);
- } else {
- return $from.call(TypedArray, data);
- }
- hide(that, '_d', {
- b: buffer,
- o: offset,
- l: byteLength,
- e: length,
- v: new $DataView(buffer)
- });
- while (index < length) addElement(that, index++);
- });
- TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);
- hide(TypedArrayPrototype, 'constructor', TypedArray);
- } else if (!fails(function () {
- TypedArray(1);
- }) || !fails(function () {
- new TypedArray(-1); // eslint-disable-line no-new
- }) || !$iterDetect(function (iter) {
- new TypedArray(); // eslint-disable-line no-new
- new TypedArray(null); // eslint-disable-line no-new
- new TypedArray(1.5); // eslint-disable-line no-new
- new TypedArray(iter); // eslint-disable-line no-new
- }, true)) {
- TypedArray = wrapper(function (that, data, $offset, $length) {
- anInstance(that, TypedArray, NAME);
- var klass;
- // `ws` module bug, temporarily remove validation length for Uint8Array
- // https://github.com/websockets/ws/pull/645
- if (!isObject(data)) return new Base(toIndex(data));
- if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
- return $length !== undefined
- ? new Base(data, toOffset($offset, BYTES), $length)
- : $offset !== undefined
- ? new Base(data, toOffset($offset, BYTES))
- : new Base(data);
- }
- if (TYPED_ARRAY in data) return fromList(TypedArray, data);
- return $from.call(TypedArray, data);
- });
- arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {
- if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);
- });
- TypedArray[PROTOTYPE] = TypedArrayPrototype;
- TypedArrayPrototype.constructor = TypedArray;
- }
- var $nativeIterator = TypedArrayPrototype[ITERATOR];
- var CORRECT_ITER_NAME = !!$nativeIterator
- && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);
- var $iterator = $iterators.values;
- hide(TypedArray, TYPED_CONSTRUCTOR, true);
- hide(TypedArrayPrototype, TYPED_ARRAY, NAME);
- hide(TypedArrayPrototype, VIEW, true);
- hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);
-
- if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {
- dP(TypedArrayPrototype, TAG, {
- get: function () { return NAME; }
- });
- }
-
- O[NAME] = TypedArray;
-
- $export($export.G + $export.W + $export.F * (TypedArray != Base), O);
-
- $export($export.S, NAME, {
- BYTES_PER_ELEMENT: BYTES
- });
-
- $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {
- from: $from,
- of: $of
- });
-
- if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);
-
- $export($export.P, NAME, proto);
-
- setSpecies(NAME);
-
- $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });
-
- $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);
-
- if (TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;
-
- $export($export.P + $export.F * fails(function () {
- new TypedArray(1).slice();
- }), NAME, { slice: $slice });
-
- $export($export.P + $export.F * (fails(function () {
- return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();
- }) || !fails(function () {
- TypedArrayPrototype.toLocaleString.call([1, 2]);
- })), NAME, { toLocaleString: $toLocaleString });
-
- Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;
- if (!CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);
- };
- } else module.exports = function () { /* empty */ };
- });
-
- _typedArray('Int8', 1, function (init) {
- return function Int8Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
- });
-
- _typedArray('Uint8', 1, function (init) {
- return function Uint8Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
- });
-
- _typedArray('Uint8', 1, function (init) {
- return function Uint8ClampedArray(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
- }, true);
-
- _typedArray('Int16', 2, function (init) {
- return function Int16Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
- });
-
- _typedArray('Uint16', 2, function (init) {
- return function Uint16Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
- });
-
- _typedArray('Int32', 4, function (init) {
- return function Int32Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
- });
-
- _typedArray('Uint32', 4, function (init) {
- return function Uint32Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
- });
-
- _typedArray('Float32', 4, function (init) {
- return function Float32Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
- });
-
- _typedArray('Float64', 8, function (init) {
- return function Float64Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
- });
-
- // call something on iterator step with safe closing on error
-
- var _iterCall = function (iterator, fn, value, entries) {
- try {
- return entries ? fn(_anObject(value)[0], value[1]) : fn(value);
- // 7.4.6 IteratorClose(iterator, completion)
- } catch (e) {
- var ret = iterator['return'];
- if (ret !== undefined) _anObject(ret.call(iterator));
- throw e;
- }
- };
-
- var _forOf = createCommonjsModule(function (module) {
- var BREAK = {};
- var RETURN = {};
- var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
- var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable);
- var f = _ctx(fn, that, entries ? 2 : 1);
- var index = 0;
- var length, step, iterator, result;
- if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
- // fast case for arrays with default iterator
- if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) {
- result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
- if (result === BREAK || result === RETURN) return result;
- } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
- result = _iterCall(iterator, f, step.value, entries);
- if (result === BREAK || result === RETURN) return result;
- }
- };
- exports.BREAK = BREAK;
- exports.RETURN = RETURN;
- });
-
- var _meta = createCommonjsModule(function (module) {
- var META = _uid('meta');
-
-
- var setDesc = _objectDp.f;
- var id = 0;
- var isExtensible = Object.isExtensible || function () {
- return true;
- };
- var FREEZE = !_fails(function () {
- return isExtensible(Object.preventExtensions({}));
- });
- var setMeta = function (it) {
- setDesc(it, META, { value: {
- i: 'O' + ++id, // object ID
- w: {} // weak collections IDs
- } });
- };
- var fastKey = function (it, create) {
- // return primitive with prefix
- if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
- if (!_has(it, META)) {
- // can't set metadata to uncaught frozen object
- if (!isExtensible(it)) return 'F';
- // not necessary to add metadata
- if (!create) return 'E';
- // add missing metadata
- setMeta(it);
- // return object ID
- } return it[META].i;
- };
- var getWeak = function (it, create) {
- if (!_has(it, META)) {
- // can't set metadata to uncaught frozen object
- if (!isExtensible(it)) return true;
- // not necessary to add metadata
- if (!create) return false;
- // add missing metadata
- setMeta(it);
- // return hash weak collections IDs
- } return it[META].w;
- };
- // add metadata on freeze-family methods calling
- var onFreeze = function (it) {
- if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it);
- return it;
- };
- var meta = module.exports = {
- KEY: META,
- NEED: false,
- fastKey: fastKey,
- getWeak: getWeak,
- onFreeze: onFreeze
- };
- });
- var _meta_1 = _meta.KEY;
- var _meta_2 = _meta.NEED;
- var _meta_3 = _meta.fastKey;
- var _meta_4 = _meta.getWeak;
- var _meta_5 = _meta.onFreeze;
-
- var _validateCollection = function (it, TYPE) {
- if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
- return it;
- };
-
- var dP$1 = _objectDp.f;
-
-
-
-
-
-
-
-
-
- var fastKey = _meta.fastKey;
-
- var SIZE = _descriptors ? '_s' : 'size';
-
- var getEntry = function (that, key) {
- // fast case
- var index = fastKey(key);
- var entry;
- if (index !== 'F') return that._i[index];
- // frozen object case
- for (entry = that._f; entry; entry = entry.n) {
- if (entry.k == key) return entry;
- }
- };
-
- var _collectionStrong = {
- getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
- var C = wrapper(function (that, iterable) {
- _anInstance(that, C, NAME, '_i');
- that._t = NAME; // collection type
- that._i = _objectCreate(null); // index
- that._f = undefined; // first entry
- that._l = undefined; // last entry
- that[SIZE] = 0; // size
- if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
- });
- _redefineAll(C.prototype, {
- // 23.1.3.1 Map.prototype.clear()
- // 23.2.3.2 Set.prototype.clear()
- clear: function clear() {
- for (var that = _validateCollection(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
- entry.r = true;
- if (entry.p) entry.p = entry.p.n = undefined;
- delete data[entry.i];
- }
- that._f = that._l = undefined;
- that[SIZE] = 0;
- },
- // 23.1.3.3 Map.prototype.delete(key)
- // 23.2.3.4 Set.prototype.delete(value)
- 'delete': function (key) {
- var that = _validateCollection(this, NAME);
- var entry = getEntry(that, key);
- if (entry) {
- var next = entry.n;
- var prev = entry.p;
- delete that._i[entry.i];
- entry.r = true;
- if (prev) prev.n = next;
- if (next) next.p = prev;
- if (that._f == entry) that._f = next;
- if (that._l == entry) that._l = prev;
- that[SIZE]--;
- } return !!entry;
- },
- // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
- // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
- forEach: function forEach(callbackfn /* , that = undefined */) {
- _validateCollection(this, NAME);
- var f = _ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
- var entry;
- while (entry = entry ? entry.n : this._f) {
- f(entry.v, entry.k, this);
- // revert to the last existing entry
- while (entry && entry.r) entry = entry.p;
- }
- },
- // 23.1.3.7 Map.prototype.has(key)
- // 23.2.3.7 Set.prototype.has(value)
- has: function has(key) {
- return !!getEntry(_validateCollection(this, NAME), key);
- }
- });
- if (_descriptors) dP$1(C.prototype, 'size', {
- get: function () {
- return _validateCollection(this, NAME)[SIZE];
- }
- });
- return C;
- },
- def: function (that, key, value) {
- var entry = getEntry(that, key);
- var prev, index;
- // change existing entry
- if (entry) {
- entry.v = value;
- // create new entry
- } else {
- that._l = entry = {
- i: index = fastKey(key, true), // <- index
- k: key, // <- key
- v: value, // <- value
- p: prev = that._l, // <- previous entry
- n: undefined, // <- next entry
- r: false // <- removed
- };
- if (!that._f) that._f = entry;
- if (prev) prev.n = entry;
- that[SIZE]++;
- // add to index
- if (index !== 'F') that._i[index] = entry;
- } return that;
- },
- getEntry: getEntry,
- setStrong: function (C, NAME, IS_MAP) {
- // add .keys, .values, .entries, [@@iterator]
- // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
- _iterDefine(C, NAME, function (iterated, kind) {
- this._t = _validateCollection(iterated, NAME); // target
- this._k = kind; // kind
- this._l = undefined; // previous
- }, function () {
- var that = this;
- var kind = that._k;
- var entry = that._l;
- // revert to the last existing entry
- while (entry && entry.r) entry = entry.p;
- // get next entry
- if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
- // or finish the iteration
- that._t = undefined;
- return _iterStep(1);
- }
- // return step by kind
- if (kind == 'keys') return _iterStep(0, entry.k);
- if (kind == 'values') return _iterStep(0, entry.v);
- return _iterStep(0, [entry.k, entry.v]);
- }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
-
- // add [@@species], 23.1.2.2, 23.2.2.2
- _setSpecies(NAME);
- }
- };
-
- // Works with __proto__ only. Old v8 can't work with null proto objects.
- /* eslint-disable no-proto */
-
-
- var check = function (O, proto) {
- _anObject(O);
- if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
- };
- var _setProto = {
- set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
- function (test, buggy, set) {
- try {
- set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);
- set(test, []);
- buggy = !(test instanceof Array);
- } catch (e) { buggy = true; }
- return function setPrototypeOf(O, proto) {
- check(O, proto);
- if (buggy) O.__proto__ = proto;
- else set(O, proto);
- return O;
- };
- }({}, false) : undefined),
- check: check
- };
-
- var setPrototypeOf = _setProto.set;
- var _inheritIfRequired = function (that, target, C) {
- var S = target.constructor;
- var P;
- if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) {
- setPrototypeOf(that, P);
- } return that;
- };
-
- var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
- var Base = _global[NAME];
- var C = Base;
- var ADDER = IS_MAP ? 'set' : 'add';
- var proto = C && C.prototype;
- var O = {};
- var fixMethod = function (KEY) {
- var fn = proto[KEY];
- _redefine(proto, KEY,
- KEY == 'delete' ? function (a) {
- return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
- } : KEY == 'has' ? function has(a) {
- return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
- } : KEY == 'get' ? function get(a) {
- return IS_WEAK && !_isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
- } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }
- : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }
- );
- };
- if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () {
- new C().entries().next();
- }))) {
- // create collection constructor
- C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
- _redefineAll(C.prototype, methods);
- _meta.NEED = true;
- } else {
- var instance = new C();
- // early implementations not supports chaining
- var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
- // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
- var THROWS_ON_PRIMITIVES = _fails(function () { instance.has(1); });
- // most early implementations doesn't supports iterables, most modern - not close it correctly
- var ACCEPT_ITERABLES = _iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new
- // for early implementations -0 and +0 not the same
- var BUGGY_ZERO = !IS_WEAK && _fails(function () {
- // V8 ~ Chromium 42- fails only with 5+ elements
- var $instance = new C();
- var index = 5;
- while (index--) $instance[ADDER](index, index);
- return !$instance.has(-0);
- });
- if (!ACCEPT_ITERABLES) {
- C = wrapper(function (target, iterable) {
- _anInstance(target, C, NAME);
- var that = _inheritIfRequired(new Base(), target, C);
- if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
- return that;
- });
- C.prototype = proto;
- proto.constructor = C;
- }
- if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
- fixMethod('delete');
- fixMethod('has');
- IS_MAP && fixMethod('get');
- }
- if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
- // weak collections should not contains .clear method
- if (IS_WEAK && proto.clear) delete proto.clear;
- }
-
- _setToStringTag(C, NAME);
-
- O[NAME] = C;
- _export(_export.G + _export.W + _export.F * (C != Base), O);
-
- if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
-
- return C;
- };
-
- var MAP = 'Map';
-
- // 23.1 Map Objects
- var es6_map = _collection(MAP, function (get) {
- return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
- }, {
- // 23.1.3.6 Map.prototype.get(key)
- get: function get(key) {
- var entry = _collectionStrong.getEntry(_validateCollection(this, MAP), key);
- return entry && entry.v;
- },
- // 23.1.3.9 Map.prototype.set(key, value)
- set: function set(key, value) {
- return _collectionStrong.def(_validateCollection(this, MAP), key === 0 ? 0 : key, value);
- }
- }, _collectionStrong, true);
-
- var SET = 'Set';
-
- // 23.2 Set Objects
- var es6_set = _collection(SET, function (get) {
- return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
- }, {
- // 23.2.3.1 Set.prototype.add(value)
- add: function add(value) {
- return _collectionStrong.def(_validateCollection(this, SET), value = value === 0 ? 0 : value, value);
- }
- }, _collectionStrong);
-
- var f$4 = Object.getOwnPropertySymbols;
-
- var _objectGops = {
- f: f$4
- };
-
- // 19.1.2.1 Object.assign(target, source, ...)
-
-
-
-
-
- var $assign = Object.assign;
-
- // should work with symbols and should have deterministic property order (V8 bug)
- var _objectAssign = !$assign || _fails(function () {
- var A = {};
- var B = {};
- // eslint-disable-next-line no-undef
- var S = Symbol();
- var K = 'abcdefghijklmnopqrst';
- A[S] = 7;
- K.split('').forEach(function (k) { B[k] = k; });
- return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
- }) ? function assign(target, source) { // eslint-disable-line no-unused-vars
- var T = _toObject(target);
- var aLen = arguments.length;
- var index = 1;
- var getSymbols = _objectGops.f;
- var isEnum = _objectPie.f;
- while (aLen > index) {
- var S = _iobject(arguments[index++]);
- var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S);
- var length = keys.length;
- var j = 0;
- var key;
- while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
- } return T;
- } : $assign;
-
- var getWeak = _meta.getWeak;
-
-
-
-
-
-
-
- var arrayFind = _arrayMethods(5);
- var arrayFindIndex = _arrayMethods(6);
- var id$1 = 0;
-
- // fallback for uncaught frozen keys
- var uncaughtFrozenStore = function (that) {
- return that._l || (that._l = new UncaughtFrozenStore());
- };
- var UncaughtFrozenStore = function () {
- this.a = [];
- };
- var findUncaughtFrozen = function (store, key) {
- return arrayFind(store.a, function (it) {
- return it[0] === key;
- });
- };
- UncaughtFrozenStore.prototype = {
- get: function (key) {
- var entry = findUncaughtFrozen(this, key);
- if (entry) return entry[1];
- },
- has: function (key) {
- return !!findUncaughtFrozen(this, key);
- },
- set: function (key, value) {
- var entry = findUncaughtFrozen(this, key);
- if (entry) entry[1] = value;
- else this.a.push([key, value]);
- },
- 'delete': function (key) {
- var index = arrayFindIndex(this.a, function (it) {
- return it[0] === key;
- });
- if (~index) this.a.splice(index, 1);
- return !!~index;
- }
- };
-
- var _collectionWeak = {
- getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
- var C = wrapper(function (that, iterable) {
- _anInstance(that, C, NAME, '_i');
- that._t = NAME; // collection type
- that._i = id$1++; // collection id
- that._l = undefined; // leak store for uncaught frozen objects
- if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
- });
- _redefineAll(C.prototype, {
- // 23.3.3.2 WeakMap.prototype.delete(key)
- // 23.4.3.3 WeakSet.prototype.delete(value)
- 'delete': function (key) {
- if (!_isObject(key)) return false;
- var data = getWeak(key);
- if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME))['delete'](key);
- return data && _has(data, this._i) && delete data[this._i];
- },
- // 23.3.3.4 WeakMap.prototype.has(key)
- // 23.4.3.4 WeakSet.prototype.has(value)
- has: function has(key) {
- if (!_isObject(key)) return false;
- var data = getWeak(key);
- if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME)).has(key);
- return data && _has(data, this._i);
- }
- });
- return C;
- },
- def: function (that, key, value) {
- var data = getWeak(_anObject(key), true);
- if (data === true) uncaughtFrozenStore(that).set(key, value);
- else data[that._i] = value;
- return that;
- },
- ufstore: uncaughtFrozenStore
- };
-
- var es6_weakMap = createCommonjsModule(function (module) {
- var each = _arrayMethods(0);
-
-
-
-
-
-
-
- var WEAK_MAP = 'WeakMap';
- var getWeak = _meta.getWeak;
- var isExtensible = Object.isExtensible;
- var uncaughtFrozenStore = _collectionWeak.ufstore;
- var tmp = {};
- var InternalMap;
-
- var wrapper = function (get) {
- return function WeakMap() {
- return get(this, arguments.length > 0 ? arguments[0] : undefined);
- };
- };
-
- var methods = {
- // 23.3.3.3 WeakMap.prototype.get(key)
- get: function get(key) {
- if (_isObject(key)) {
- var data = getWeak(key);
- if (data === true) return uncaughtFrozenStore(_validateCollection(this, WEAK_MAP)).get(key);
- return data ? data[this._i] : undefined;
- }
- },
- // 23.3.3.5 WeakMap.prototype.set(key, value)
- set: function set(key, value) {
- return _collectionWeak.def(_validateCollection(this, WEAK_MAP), key, value);
- }
- };
-
- // 23.3 WeakMap Objects
- var $WeakMap = module.exports = _collection(WEAK_MAP, wrapper, methods, _collectionWeak, true, true);
-
- // IE11 WeakMap frozen keys fix
- if (_fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {
- InternalMap = _collectionWeak.getConstructor(wrapper, WEAK_MAP);
- _objectAssign(InternalMap.prototype, methods);
- _meta.NEED = true;
- each(['delete', 'has', 'get', 'set'], function (key) {
- var proto = $WeakMap.prototype;
- var method = proto[key];
- _redefine(proto, key, function (a, b) {
- // store frozen objects on internal weakmap shim
- if (_isObject(a) && !isExtensible(a)) {
- if (!this._f) this._f = new InternalMap();
- var result = this._f[key](a, b);
- return key == 'set' ? this : result;
- // store all the rest on native weakmap
- } return method.call(this, a, b);
- });
- });
- }
- });
-
- var WEAK_SET = 'WeakSet';
-
- // 23.4 WeakSet Objects
- _collection(WEAK_SET, function (get) {
- return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
- }, {
- // 23.4.3.1 WeakSet.prototype.add(value)
- add: function add(value) {
- return _collectionWeak.def(_validateCollection(this, WEAK_SET), value, true);
- }
- }, _collectionWeak, false, true);
-
- // 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
-
-
-
- var rApply = (_global.Reflect || {}).apply;
- var fApply = Function.apply;
- // MS Edge argumentsList argument is optional
- _export(_export.S + _export.F * !_fails(function () {
- rApply(function () { /* empty */ });
- }), 'Reflect', {
- apply: function apply(target, thisArgument, argumentsList) {
- var T = _aFunction(target);
- var L = _anObject(argumentsList);
- return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);
- }
- });
-
- // fast apply, http://jsperf.lnkit.com/fast-apply/5
- var _invoke = function (fn, args, that) {
- var un = that === undefined;
- switch (args.length) {
- case 0: return un ? fn()
- : fn.call(that);
- case 1: return un ? fn(args[0])
- : fn.call(that, args[0]);
- case 2: return un ? fn(args[0], args[1])
- : fn.call(that, args[0], args[1]);
- case 3: return un ? fn(args[0], args[1], args[2])
- : fn.call(that, args[0], args[1], args[2]);
- case 4: return un ? fn(args[0], args[1], args[2], args[3])
- : fn.call(that, args[0], args[1], args[2], args[3]);
- } return fn.apply(that, args);
- };
-
- var arraySlice = [].slice;
- var factories = {};
-
- var construct = function (F, len, args) {
- if (!(len in factories)) {
- for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';
- // eslint-disable-next-line no-new-func
- factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
- } return factories[len](F, args);
- };
-
- var _bind = Function.bind || function bind(that /* , ...args */) {
- var fn = _aFunction(this);
- var partArgs = arraySlice.call(arguments, 1);
- var bound = function (/* args... */) {
- var args = partArgs.concat(arraySlice.call(arguments));
- return this instanceof bound ? construct(fn, args.length, args) : _invoke(fn, args, that);
- };
- if (_isObject(fn.prototype)) bound.prototype = fn.prototype;
- return bound;
- };
-
- // 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
-
-
-
-
-
-
-
- var rConstruct = (_global.Reflect || {}).construct;
-
- // MS Edge supports only 2 arguments and argumentsList argument is optional
- // FF Nightly sets third argument as `new.target`, but does not create `this` from it
- var NEW_TARGET_BUG = _fails(function () {
- function F() { /* empty */ }
- return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);
- });
- var ARGS_BUG = !_fails(function () {
- rConstruct(function () { /* empty */ });
- });
-
- _export(_export.S + _export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
- construct: function construct(Target, args /* , newTarget */) {
- _aFunction(Target);
- _anObject(args);
- var newTarget = arguments.length < 3 ? Target : _aFunction(arguments[2]);
- if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);
- if (Target == newTarget) {
- // w/o altered newTarget, optimization for 0-4 arguments
- switch (args.length) {
- case 0: return new Target();
- case 1: return new Target(args[0]);
- case 2: return new Target(args[0], args[1]);
- case 3: return new Target(args[0], args[1], args[2]);
- case 4: return new Target(args[0], args[1], args[2], args[3]);
- }
- // w/o altered newTarget, lot of arguments case
- var $args = [null];
- $args.push.apply($args, args);
- return new (_bind.apply(Target, $args))();
- }
- // with altered newTarget, not support built-in constructors
- var proto = newTarget.prototype;
- var instance = _objectCreate(_isObject(proto) ? proto : Object.prototype);
- var result = Function.apply.call(Target, instance, args);
- return _isObject(result) ? result : instance;
- }
- });
- // 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
+ var percent = 0;
+ var clientRect = this.elements.progress.getBoundingClientRect();
+ var visible = "".concat(this.config.classNames.tooltip, "--visible");
+ var toggle = function toggle(_toggle) {
+ toggleClass(_this4.elements.display.seekTooltip, visible, _toggle);
+ }; // Hide on touch
+
+
+ if (this.touch) {
+ toggle(false);
+ return;
+ } // Determine percentage, if already visible
+ if (is$1.event(event)) {
+ percent = 100 / clientRect.width * (event.pageX - clientRect.left);
+ } else if (hasClass(this.elements.display.seekTooltip, visible)) {
+ percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
+ } else {
+ return;
+ } // Set bounds
- // MS Edge has broken Reflect.defineProperty - throwing instead of returning false
- _export(_export.S + _export.F * _fails(function () {
- // eslint-disable-next-line no-undef
- Reflect.defineProperty(_objectDp.f({}, 1, { value: 1 }), 1, { value: 2 });
- }), 'Reflect', {
- defineProperty: function defineProperty(target, propertyKey, attributes) {
- _anObject(target);
- propertyKey = _toPrimitive(propertyKey, true);
- _anObject(attributes);
- try {
- _objectDp.f(target, propertyKey, attributes);
- return true;
- } catch (e) {
- return false;
- }
- }
- });
+ if (percent < 0) {
+ percent = 0;
+ } else if (percent > 100) {
+ percent = 100;
+ } // Display the time a click would seek to
- // 26.1.4 Reflect.deleteProperty(target, propertyKey)
- var gOPD$1 = _objectGopd.f;
+ controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position
+ this.elements.display.seekTooltip.style.left = "".concat(percent, "%"); // Show/hide the tooltip
+ // If the event is a moues in/out and percentage is inside bounds
- _export(_export.S, 'Reflect', {
- deleteProperty: function deleteProperty(target, propertyKey) {
- var desc = gOPD$1(_anObject(target), propertyKey);
- return desc && !desc.configurable ? false : delete target[propertyKey];
- }
- });
+ if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
+ toggle(event.type === 'mouseenter');
+ }
+ },
+ // Handle time change event
+ timeUpdate: function timeUpdate(event) {
+ // Only invert if only one time element is displayed and used for both duration and currentTime
+ var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration
- // 26.1.6 Reflect.get(target, propertyKey [, receiver])
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking
+ if (event && event.type === 'timeupdate' && this.media.seeking) {
+ return;
+ } // Playing progress
+ controls.updateProgress.call(this, event);
+ },
+ // Show the duration on metadataloaded or durationchange events
+ durationUpdate: function durationUpdate() {
+ // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
+ if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
+ return;
+ } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.
+ // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415
+ // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062
+ // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338
+ if (this.duration >= Math.pow(2, 32)) {
+ toggleHidden(this.elements.display.currentTime, true);
+ toggleHidden(this.elements.progress, true);
+ return;
+ } // Update ARIA values
- function get(target, propertyKey /* , receiver */) {
- var receiver = arguments.length < 3 ? target : arguments[2];
- var desc, proto;
- if (_anObject(target) === receiver) return target[propertyKey];
- if (desc = _objectGopd.f(target, propertyKey)) return _has(desc, 'value')
- ? desc.value
- : desc.get !== undefined
- ? desc.get.call(receiver)
- : undefined;
- if (_isObject(proto = _objectGpo(target))) return get(proto, propertyKey, receiver);
- }
+ if (is$1.element(this.elements.inputs.seek)) {
+ this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
+ } // If there's a spot to display duration
- _export(_export.S, 'Reflect', { get: get });
- // 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
+ var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there
+ if (!hasDuration && this.config.displayDuration && this.paused) {
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
+ } // If there's a duration element, update content
+ if (hasDuration) {
+ controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
+ } // Update the tooltip (if visible)
- _export(_export.S, 'Reflect', {
- getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
- return _objectGopd.f(_anObject(target), propertyKey);
- }
- });
- // 26.1.8 Reflect.getPrototypeOf(target)
+ controls.updateSeekTooltip.call(this);
+ },
+ // Hide/show a tab
+ toggleMenuButton: function toggleMenuButton(setting, toggle) {
+ toggleHidden(this.elements.settings.buttons[setting], !toggle);
+ },
+ // Update the selected setting
+ updateSetting: function updateSetting(setting, container, input) {
+ var pane = this.elements.settings.panels[setting];
+ var value = null;
+ var list = container;
+ if (setting === 'captions') {
+ value = this.currentTrack;
+ } else {
+ value = !is$1.empty(input) ? input : this[setting]; // Get default
+ if (is$1.empty(value)) {
+ value = this.config[setting].default;
+ } // Unsupported value
- _export(_export.S, 'Reflect', {
- getPrototypeOf: function getPrototypeOf(target) {
- return _objectGpo(_anObject(target));
- }
- });
+ if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {
+ this.debug.warn("Unsupported value of '".concat(value, "' for ").concat(setting));
+ return;
+ } // Disabled value
- // 26.1.9 Reflect.has(target, propertyKey)
+ if (!this.config[setting].options.includes(value)) {
+ this.debug.warn("Disabled value of '".concat(value, "' for ").concat(setting));
+ return;
+ }
+ } // Get the list if we need to
- _export(_export.S, 'Reflect', {
- has: function has(target, propertyKey) {
- return propertyKey in target;
- }
- });
- // 26.1.10 Reflect.isExtensible(target)
+ if (!is$1.element(list)) {
+ list = pane && pane.querySelector('[role="menu"]');
+ } // If there's no list it means it's not been rendered...
- var $isExtensible = Object.isExtensible;
+ if (!is$1.element(list)) {
+ return;
+ } // Update the label
- _export(_export.S, 'Reflect', {
- isExtensible: function isExtensible(target) {
- _anObject(target);
- return $isExtensible ? $isExtensible(target) : true;
- }
- });
- // all object keys, includes non-enumerable and symbols
+ var label = this.elements.settings.buttons[setting].querySelector(".".concat(this.config.classNames.menu.value));
+ label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it
+ var target = list && list.querySelector("[value=\"".concat(value, "\"]"));
+
+ if (is$1.element(target)) {
+ target.checked = true;
+ }
+ },
+ // Translate a value into a nice label
+ getLabel: function getLabel(setting, value) {
+ switch (setting) {
+ case 'speed':
+ return value === 1 ? i18n.get('normal', this.config) : "".concat(value, "&times;");
+
+ case 'quality':
+ if (is$1.number(value)) {
+ var label = i18n.get("qualityLabel.".concat(value), this.config);
+
+ if (!label.length) {
+ return "".concat(value, "p");
+ }
+
+ return label;
+ }
+
+ return toTitleCase(value);
+
+ case 'captions':
+ return captions.getLabel.call(this);
+
+ default:
+ return null;
+ }
+ },
+ // Set the quality menu
+ setQualityMenu: function setQualityMenu(options) {
+ var _this5 = this;
+
+ // Menu required
+ if (!is$1.element(this.elements.settings.panels.quality)) {
+ return;
+ }
+
+ var type = 'quality';
+ var list = this.elements.settings.panels.quality.querySelector('[role="menu"]'); // Set options if passed and filter based on uniqueness and config
+
+ if (is$1.array(options)) {
+ this.options.quality = dedupe(options).filter(function (quality) {
+ return _this5.config.quality.options.includes(quality);
+ });
+ } // Toggle the pane and tab
+
+
+ var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
+
+ emptyElement(list); // Check if we need to toggle the parent
+
+ controls.checkMenu.call(this); // If we're hiding, nothing more to do
+
+ if (!toggle) {
+ return;
+ } // Get the badge HTML for HD, 4K etc
+
+
+ var getBadge = function getBadge(quality) {
+ var label = i18n.get("qualityBadge.".concat(quality), _this5.config);
+
+ if (!label.length) {
+ return null;
+ }
+
+ return controls.createBadge.call(_this5, label);
+ }; // Sort options by the config and then render options
+
+
+ this.options.quality.sort(function (a, b) {
+ var sorting = _this5.config.quality.options;
+ return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
+ }).forEach(function (quality) {
+ controls.createMenuItem.call(_this5, {
+ value: quality,
+ list: list,
+ type: type,
+ title: controls.getLabel.call(_this5, 'quality', quality),
+ badge: getBadge(quality)
+ });
+ });
+ controls.updateSetting.call(this, type, list);
+ },
+ // Set the looping options
+
+ /* setLoopMenu() {
+ // Menu required
+ if (!is.element(this.elements.settings.panels.loop)) {
+ return;
+ }
+ const options = ['start', 'end', 'all', 'reset'];
+ const list = this.elements.settings.panels.loop.querySelector('[role="menu"]');
+ // Show the pane and tab
+ toggleHidden(this.elements.settings.buttons.loop, false);
+ toggleHidden(this.elements.settings.panels.loop, false);
+ // Toggle the pane and tab
+ const toggle = !is.empty(this.loop.options);
+ controls.toggleMenuButton.call(this, 'loop', toggle);
+ // Empty the menu
+ emptyElement(list);
+ options.forEach(option => {
+ const item = createElement('li');
+ const button = createElement(
+ 'button',
+ extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
+ type: 'button',
+ class: this.config.classNames.control,
+ 'data-plyr-loop-action': option,
+ }),
+ i18n.get(option, this.config)
+ );
+ if (['start', 'end'].includes(option)) {
+ const badge = controls.createBadge.call(this, '00:00');
+ button.appendChild(badge);
+ }
+ item.appendChild(button);
+ list.appendChild(item);
+ });
+ }, */
+ // Get current selected caption language
+ // TODO: rework this to user the getter in the API?
+ // Set a list of available captions languages
+ setCaptionsMenu: function setCaptionsMenu() {
+ var _this6 = this;
+
+ // Menu required
+ if (!is$1.element(this.elements.settings.panels.captions)) {
+ return;
+ } // TODO: Captions or language? Currently it's mixed
+
+
+ var type = 'captions';
+ var list = this.elements.settings.panels.captions.querySelector('[role="menu"]');
+ var tracks = captions.getTracks.call(this);
+ var toggle = Boolean(tracks.length); // Toggle the pane and tab
+
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
+
+ emptyElement(list); // Check if we need to toggle the parent
+
+ controls.checkMenu.call(this); // If there's no captions, bail
+
+ if (!toggle) {
+ return;
+ } // Generate options data
+
+
+ var options = tracks.map(function (track, value) {
+ return {
+ value: value,
+ checked: _this6.captions.toggled && _this6.currentTrack === value,
+ title: captions.getLabel.call(_this6, track),
+ badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()),
+ list: list,
+ type: 'language'
+ };
+ }); // Add the "Disabled" option to turn off captions
+
+ options.unshift({
+ value: -1,
+ checked: !this.captions.toggled,
+ title: i18n.get('disabled', this.config),
+ list: list,
+ type: 'language'
+ }); // Generate options
+
+ options.forEach(controls.createMenuItem.bind(this));
+ controls.updateSetting.call(this, type, list);
+ },
+ // Set a list of available captions languages
+ setSpeedMenu: function setSpeedMenu(options) {
+ var _this7 = this;
+
+ // Menu required
+ if (!is$1.element(this.elements.settings.panels.speed)) {
+ return;
+ }
+
+ var type = 'speed';
+ var list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); // Set the speed options
+
+ if (is$1.array(options)) {
+ this.options.speed = options;
+ } else if (this.isHTML5 || this.isVimeo) {
+ this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
+ } // Set options if passed and filter based on config
+
+
+ this.options.speed = this.options.speed.filter(function (speed) {
+ return _this7.config.speed.options.includes(speed);
+ }); // Toggle the pane and tab
+
+ var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
+
+ emptyElement(list); // Check if we need to toggle the parent
+
+ controls.checkMenu.call(this); // If we're hiding, nothing more to do
+
+ if (!toggle) {
+ return;
+ } // Create items
+
+
+ this.options.speed.forEach(function (speed) {
+ controls.createMenuItem.call(_this7, {
+ value: speed,
+ list: list,
+ type: type,
+ title: controls.getLabel.call(_this7, 'speed', speed)
+ });
+ });
+ controls.updateSetting.call(this, type, list);
+ },
+ // Check if we need to hide/show the settings menu
+ checkMenu: function checkMenu() {
+ var buttons = this.elements.settings.buttons;
+ var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {
+ return !button.hidden;
+ });
+ toggleHidden(this.elements.settings.menu, !visible);
+ },
+ // Focus the first menu item in a given (or visible) menu
+ focusFirstMenuItem: function focusFirstMenuItem(pane) {
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (this.elements.settings.popup.hidden) {
+ return;
+ }
+
+ var target = pane;
+
+ if (!is$1.element(target)) {
+ target = Object.values(this.elements.settings.panels).find(function (pane) {
+ return !pane.hidden;
+ });
+ }
+
+ var firstItem = target.querySelector('[role^="menuitem"]');
+ setFocus.call(this, firstItem, tabFocus);
+ },
+ // Show/hide menu
+ toggleMenu: function toggleMenu(input) {
+ var popup = this.elements.settings.popup;
+ var button = this.elements.buttons.settings; // Menu and button are required
+
+ if (!is$1.element(popup) || !is$1.element(button)) {
+ return;
+ } // True toggle by default
+
+
+ var hidden = popup.hidden;
+ var show = hidden;
+
+ if (is$1.boolean(input)) {
+ show = input;
+ } else if (is$1.keyboardEvent(input) && input.which === 27) {
+ show = false;
+ } else if (is$1.event(input)) {
+ var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click
+ // wasn't the button or menu item and we're trying to
+ // show the menu (a doc click shouldn't show the menu)
+
+ if (isMenuItem || !isMenuItem && input.target !== button && show) {
+ return;
+ }
+ } // Set button attributes
- var Reflect$1 = _global.Reflect;
- var _ownKeys = Reflect$1 && Reflect$1.ownKeys || function ownKeys(it) {
- var keys = _objectGopn.f(_anObject(it));
- var getSymbols = _objectGops.f;
- return getSymbols ? keys.concat(getSymbols(it)) : keys;
- };
+ button.setAttribute('aria-expanded', show); // Show the actual popup
- // 26.1.11 Reflect.ownKeys(target)
+ toggleHidden(popup, !show); // Add class hook
+ toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction
- _export(_export.S, 'Reflect', { ownKeys: _ownKeys });
+ if (show && is$1.keyboardEvent(input)) {
+ controls.focusFirstMenuItem.call(this, null, true);
+ } else if (!show && !hidden) {
+ // If closing, re-focus the button
+ setFocus.call(this, button, is$1.keyboardEvent(input));
+ }
+ },
+ // Get the natural size of a menu panel
+ getMenuSize: function getMenuSize(tab) {
+ var clone = tab.cloneNode(true);
+ clone.style.position = 'absolute';
+ clone.style.opacity = 0;
+ clone.removeAttribute('hidden'); // Append to parent so we get the "real" size
- // 26.1.12 Reflect.preventExtensions(target)
+ tab.parentNode.appendChild(clone); // Get the sizes before we remove
+ var width = clone.scrollWidth;
+ var height = clone.scrollHeight; // Remove from the DOM
- var $preventExtensions = Object.preventExtensions;
+ removeElement(clone);
+ return {
+ width: width,
+ height: height
+ };
+ },
+ // Show a panel in the menu
+ showMenuPanel: function showMenuPanel() {
+ var _this8 = this;
- _export(_export.S, 'Reflect', {
- preventExtensions: function preventExtensions(target) {
- _anObject(target);
- try {
- if ($preventExtensions) $preventExtensions(target);
- return true;
- } catch (e) {
- return false;
- }
- }
- });
+ var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var target = document.getElementById("plyr-settings-".concat(this.id, "-").concat(type)); // Nothing to show, bail
- // 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
+ if (!is$1.element(target)) {
+ return;
+ } // Hide all other panels
+ var container = target.parentNode;
+ var current = Array.from(container.children).find(function (node) {
+ return !node.hidden;
+ }); // If we can do fancy animations, we'll animate the height/width
+ if (support.transitions && !support.reducedMotion) {
+ // Set the current width as a base
+ container.style.width = "".concat(current.scrollWidth, "px");
+ container.style.height = "".concat(current.scrollHeight, "px"); // Get potential sizes
+ var size = controls.getMenuSize.call(this, target); // Restore auto height/width
+ var restore = function restore(event) {
+ // We're only bothered about height and width on the container
+ if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {
+ return;
+ } // Revert back to auto
+ container.style.width = '';
+ container.style.height = ''; // Only listen once
+ off.call(_this8, container, transitionEndEvent, restore);
+ }; // Listen for the transition finishing and restore auto height/width
- function set(target, propertyKey, V /* , receiver */) {
- var receiver = arguments.length < 4 ? target : arguments[3];
- var ownDesc = _objectGopd.f(_anObject(target), propertyKey);
- var existingDescriptor, proto;
- if (!ownDesc) {
- if (_isObject(proto = _objectGpo(target))) {
- return set(proto, propertyKey, V, receiver);
- }
- ownDesc = _propertyDesc(0);
- }
- if (_has(ownDesc, 'value')) {
- if (ownDesc.writable === false || !_isObject(receiver)) return false;
- if (existingDescriptor = _objectGopd.f(receiver, propertyKey)) {
- if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;
- existingDescriptor.value = V;
- _objectDp.f(receiver, propertyKey, existingDescriptor);
- } else _objectDp.f(receiver, propertyKey, _propertyDesc(0, V));
- return true;
- }
- return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
- }
-
- _export(_export.S, 'Reflect', { set: set });
-
- // 26.1.14 Reflect.setPrototypeOf(target, proto)
-
-
-
- if (_setProto) _export(_export.S, 'Reflect', {
- setPrototypeOf: function setPrototypeOf(target, proto) {
- _setProto.check(target, proto);
- try {
- _setProto.set(target, proto);
- return true;
- } catch (e) {
- return false;
- }
- }
- });
-
- var process = _global.process;
- var setTask = _global.setImmediate;
- var clearTask = _global.clearImmediate;
- var MessageChannel = _global.MessageChannel;
- var Dispatch = _global.Dispatch;
- var counter = 0;
- var queue = {};
- var ONREADYSTATECHANGE = 'onreadystatechange';
- var defer, channel, port;
- var run = function () {
- var id = +this;
- // eslint-disable-next-line no-prototype-builtins
- if (queue.hasOwnProperty(id)) {
- var fn = queue[id];
- delete queue[id];
- fn();
- }
- };
- var listener = function (event) {
- run.call(event.data);
- };
- // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
- if (!setTask || !clearTask) {
- setTask = function setImmediate(fn) {
- var args = [];
- var i = 1;
- while (arguments.length > i) args.push(arguments[i++]);
- queue[++counter] = function () {
- // eslint-disable-next-line no-new-func
- _invoke(typeof fn == 'function' ? fn : Function(fn), args);
- };
- defer(counter);
- return counter;
- };
- clearTask = function clearImmediate(id) {
- delete queue[id];
- };
- // Node.js 0.8-
- if (_cof(process) == 'process') {
- defer = function (id) {
- process.nextTick(_ctx(run, id, 1));
- };
- // Sphere (JS game engine) Dispatch API
- } else if (Dispatch && Dispatch.now) {
- defer = function (id) {
- Dispatch.now(_ctx(run, id, 1));
- };
- // Browsers with MessageChannel, includes WebWorkers
- } else if (MessageChannel) {
- channel = new MessageChannel();
- port = channel.port2;
- channel.port1.onmessage = listener;
- defer = _ctx(port.postMessage, port, 1);
- // Browsers with postMessage, skip WebWorkers
- // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
- } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {
- defer = function (id) {
- _global.postMessage(id + '', '*');
- };
- _global.addEventListener('message', listener, false);
- // IE8-
- } else if (ONREADYSTATECHANGE in _domCreate('script')) {
- defer = function (id) {
- _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {
- _html.removeChild(this);
- run.call(id);
- };
- };
- // Rest old browsers
- } else {
- defer = function (id) {
- setTimeout(_ctx(run, id, 1), 0);
- };
- }
- }
- var _task = {
- set: setTask,
- clear: clearTask
- };
-
- var macrotask = _task.set;
- var Observer = _global.MutationObserver || _global.WebKitMutationObserver;
- var process$1 = _global.process;
- var Promise$1 = _global.Promise;
- var isNode = _cof(process$1) == 'process';
-
- var _microtask = function () {
- var head, last, notify;
-
- var flush = function () {
- var parent, fn;
- if (isNode && (parent = process$1.domain)) parent.exit();
- while (head) {
- fn = head.fn;
- head = head.next;
- try {
- fn();
- } catch (e) {
- if (head) notify();
- else last = undefined;
- throw e;
- }
- } last = undefined;
- if (parent) parent.enter();
- };
-
- // Node.js
- if (isNode) {
- notify = function () {
- process$1.nextTick(flush);
- };
- // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
- } else if (Observer && !(_global.navigator && _global.navigator.standalone)) {
- var toggle = true;
- var node = document.createTextNode('');
- new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
- notify = function () {
- node.data = toggle = !toggle;
- };
- // environments with maybe non-completely correct, but existent Promise
- } else if (Promise$1 && Promise$1.resolve) {
- // Promise.resolve without an argument throws an error in LG WebOS 2
- var promise = Promise$1.resolve(undefined);
- notify = function () {
- promise.then(flush);
- };
- // for other environments - macrotask based on:
- // - setImmediate
- // - MessageChannel
- // - window.postMessag
- // - onreadystatechange
- // - setTimeout
- } else {
- notify = function () {
- // strange IE + webpack dev server bug - use .call(global)
- macrotask.call(_global, flush);
- };
- }
-
- return function (fn) {
- var task = { fn: fn, next: undefined };
- if (last) last.next = task;
- if (!head) {
- head = task;
- notify();
- } last = task;
- };
- };
-
- // 25.4.1.5 NewPromiseCapability(C)
-
-
- function PromiseCapability(C) {
- var resolve, reject;
- this.promise = new C(function ($$resolve, $$reject) {
- if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
- resolve = $$resolve;
- reject = $$reject;
- });
- this.resolve = _aFunction(resolve);
- this.reject = _aFunction(reject);
- }
-
- var f$5 = function (C) {
- return new PromiseCapability(C);
- };
-
- var _newPromiseCapability = {
- f: f$5
- };
-
- var _perform = function (exec) {
- try {
- return { e: false, v: exec() };
- } catch (e) {
- return { e: true, v: e };
- }
- };
-
- var navigator$1 = _global.navigator;
-
- var _userAgent = navigator$1 && navigator$1.userAgent || '';
-
- var _promiseResolve = function (C, x) {
- _anObject(C);
- if (_isObject(x) && x.constructor === C) return x;
- var promiseCapability = _newPromiseCapability.f(C);
- var resolve = promiseCapability.resolve;
- resolve(x);
- return promiseCapability.promise;
- };
-
- var task = _task.set;
- var microtask = _microtask();
-
-
-
-
- var PROMISE = 'Promise';
- var TypeError$1 = _global.TypeError;
- var process$2 = _global.process;
- var versions = process$2 && process$2.versions;
- var v8 = versions && versions.v8 || '';
- var $Promise = _global[PROMISE];
- var isNode$1 = _classof(process$2) == 'process';
- var empty = function () { /* empty */ };
- var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
- var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;
-
- var USE_NATIVE = !!function () {
- try {
- // correct subclassing with @@species support
- var promise = $Promise.resolve(1);
- var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
- exec(empty, empty);
- };
- // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
- return (isNode$1 || typeof PromiseRejectionEvent == 'function')
- && promise.then(empty) instanceof FakePromise
- // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
- // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
- // we can't detect it synchronously, so just check versions
- && v8.indexOf('6.6') !== 0
- && _userAgent.indexOf('Chrome/66') === -1;
- } catch (e) { /* empty */ }
- }();
-
- // helpers
- var isThenable = function (it) {
- var then;
- return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;
- };
- var notify = function (promise, isReject) {
- if (promise._n) return;
- promise._n = true;
- var chain = promise._c;
- microtask(function () {
- var value = promise._v;
- var ok = promise._s == 1;
- var i = 0;
- var run = function (reaction) {
- var handler = ok ? reaction.ok : reaction.fail;
- var resolve = reaction.resolve;
- var reject = reaction.reject;
- var domain = reaction.domain;
- var result, then, exited;
- try {
- if (handler) {
- if (!ok) {
- if (promise._h == 2) onHandleUnhandled(promise);
- promise._h = 1;
- }
- if (handler === true) result = value;
- else {
- if (domain) domain.enter();
- result = handler(value); // may throw
- if (domain) {
- domain.exit();
- exited = true;
- }
- }
- if (result === reaction.promise) {
- reject(TypeError$1('Promise-chain cycle'));
- } else if (then = isThenable(result)) {
- then.call(result, resolve, reject);
- } else resolve(result);
- } else reject(value);
- } catch (e) {
- if (domain && !exited) domain.exit();
- reject(e);
- }
- };
- while (chain.length > i) run(chain[i++]); // variable length - can't use forEach
- promise._c = [];
- promise._n = false;
- if (isReject && !promise._h) onUnhandled(promise);
- });
- };
- var onUnhandled = function (promise) {
- task.call(_global, function () {
- var value = promise._v;
- var unhandled = isUnhandled(promise);
- var result, handler, console;
- if (unhandled) {
- result = _perform(function () {
- if (isNode$1) {
- process$2.emit('unhandledRejection', value, promise);
- } else if (handler = _global.onunhandledrejection) {
- handler({ promise: promise, reason: value });
- } else if ((console = _global.console) && console.error) {
- console.error('Unhandled promise rejection', value);
- }
- });
- // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
- promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1;
- } promise._a = undefined;
- if (unhandled && result.e) throw result.v;
- });
- };
- var isUnhandled = function (promise) {
- return promise._h !== 1 && (promise._a || promise._c).length === 0;
- };
- var onHandleUnhandled = function (promise) {
- task.call(_global, function () {
- var handler;
- if (isNode$1) {
- process$2.emit('rejectionHandled', promise);
- } else if (handler = _global.onrejectionhandled) {
- handler({ promise: promise, reason: promise._v });
- }
- });
- };
- var $reject = function (value) {
- var promise = this;
- if (promise._d) return;
- promise._d = true;
- promise = promise._w || promise; // unwrap
- promise._v = value;
- promise._s = 2;
- if (!promise._a) promise._a = promise._c.slice();
- notify(promise, true);
- };
- var $resolve = function (value) {
- var promise = this;
- var then;
- if (promise._d) return;
- promise._d = true;
- promise = promise._w || promise; // unwrap
- try {
- if (promise === value) throw TypeError$1("Promise can't be resolved itself");
- if (then = isThenable(value)) {
- microtask(function () {
- var wrapper = { _w: promise, _d: false }; // wrap
- try {
- then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1));
- } catch (e) {
- $reject.call(wrapper, e);
- }
- });
- } else {
- promise._v = value;
- promise._s = 1;
- notify(promise, false);
- }
- } catch (e) {
- $reject.call({ _w: promise, _d: false }, e); // wrap
- }
- };
-
- // constructor polyfill
- if (!USE_NATIVE) {
- // 25.4.3.1 Promise(executor)
- $Promise = function Promise(executor) {
- _anInstance(this, $Promise, PROMISE, '_h');
- _aFunction(executor);
- Internal.call(this);
- try {
- executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));
- } catch (err) {
- $reject.call(this, err);
- }
- };
- // eslint-disable-next-line no-unused-vars
- Internal = function Promise(executor) {
- this._c = []; // <- awaiting reactions
- this._a = undefined; // <- checked in isUnhandled reactions
- this._s = 0; // <- state
- this._d = false; // <- done
- this._v = undefined; // <- value
- this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
- this._n = false; // <- notify
- };
- Internal.prototype = _redefineAll($Promise.prototype, {
- // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
- then: function then(onFulfilled, onRejected) {
- var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));
- reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
- reaction.fail = typeof onRejected == 'function' && onRejected;
- reaction.domain = isNode$1 ? process$2.domain : undefined;
- this._c.push(reaction);
- if (this._a) this._a.push(reaction);
- if (this._s) notify(this, false);
- return reaction.promise;
- },
- // 25.4.5.1 Promise.prototype.catch(onRejected)
- 'catch': function (onRejected) {
- return this.then(undefined, onRejected);
- }
- });
- OwnPromiseCapability = function () {
- var promise = new Internal();
- this.promise = promise;
- this.resolve = _ctx($resolve, promise, 1);
- this.reject = _ctx($reject, promise, 1);
- };
- _newPromiseCapability.f = newPromiseCapability = function (C) {
- return C === $Promise || C === Wrapper
- ? new OwnPromiseCapability(C)
- : newGenericPromiseCapability(C);
- };
- }
-
- _export(_export.G + _export.W + _export.F * !USE_NATIVE, { Promise: $Promise });
- _setToStringTag($Promise, PROMISE);
- _setSpecies(PROMISE);
- Wrapper = _core[PROMISE];
-
- // statics
- _export(_export.S + _export.F * !USE_NATIVE, PROMISE, {
- // 25.4.4.5 Promise.reject(r)
- reject: function reject(r) {
- var capability = newPromiseCapability(this);
- var $$reject = capability.reject;
- $$reject(r);
- return capability.promise;
- }
- });
- _export(_export.S + _export.F * (!USE_NATIVE), PROMISE, {
- // 25.4.4.6 Promise.resolve(x)
- resolve: function resolve(x) {
- return _promiseResolve(_library && this === Wrapper ? $Promise : this, x);
- }
- });
- _export(_export.S + _export.F * !(USE_NATIVE && _iterDetect(function (iter) {
- $Promise.all(iter)['catch'](empty);
- })), PROMISE, {
- // 25.4.4.1 Promise.all(iterable)
- all: function all(iterable) {
- var C = this;
- var capability = newPromiseCapability(C);
- var resolve = capability.resolve;
- var reject = capability.reject;
- var result = _perform(function () {
- var values = [];
- var index = 0;
- var remaining = 1;
- _forOf(iterable, false, function (promise) {
- var $index = index++;
- var alreadyCalled = false;
- values.push(undefined);
- remaining++;
- C.resolve(promise).then(function (value) {
- if (alreadyCalled) return;
- alreadyCalled = true;
- values[$index] = value;
- --remaining || resolve(values);
- }, reject);
- });
- --remaining || resolve(values);
- });
- if (result.e) reject(result.v);
- return capability.promise;
- },
- // 25.4.4.4 Promise.race(iterable)
- race: function race(iterable) {
- var C = this;
- var capability = newPromiseCapability(C);
- var reject = capability.reject;
- var result = _perform(function () {
- _forOf(iterable, false, function (promise) {
- C.resolve(promise).then(capability.resolve, reject);
- });
- });
- if (result.e) reject(result.v);
- return capability.promise;
- }
- });
-
- var f$6 = _wks;
-
- var _wksExt = {
- f: f$6
- };
-
- var defineProperty = _objectDp.f;
- var _wksDefine = function (name) {
- var $Symbol = _core.Symbol || (_core.Symbol = _global.Symbol || {});
- if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) });
- };
-
- // all enumerable object keys, includes symbols
-
-
-
- var _enumKeys = function (it) {
- var result = _objectKeys(it);
- var getSymbols = _objectGops.f;
- if (getSymbols) {
- var symbols = getSymbols(it);
- var isEnum = _objectPie.f;
- var i = 0;
- var key;
- while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
- } return result;
- };
-
- // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
-
- var gOPN = _objectGopn.f;
- var toString$1 = {}.toString;
-
- var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
- ? Object.getOwnPropertyNames(window) : [];
-
- var getWindowNames = function (it) {
- try {
- return gOPN(it);
- } catch (e) {
- return windowNames.slice();
- }
- };
-
- var f$7 = function getOwnPropertyNames(it) {
- return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it));
- };
-
- var _objectGopnExt = {
- f: f$7
- };
-
- // ECMAScript 6 symbols shim
-
-
-
-
-
- var META = _meta.KEY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var gOPD$2 = _objectGopd.f;
- var dP$2 = _objectDp.f;
- var gOPN$1 = _objectGopnExt.f;
- var $Symbol = _global.Symbol;
- var $JSON = _global.JSON;
- var _stringify = $JSON && $JSON.stringify;
- var PROTOTYPE$2 = 'prototype';
- var HIDDEN = _wks('_hidden');
- var TO_PRIMITIVE = _wks('toPrimitive');
- var isEnum = {}.propertyIsEnumerable;
- var SymbolRegistry = _shared('symbol-registry');
- var AllSymbols = _shared('symbols');
- var OPSymbols = _shared('op-symbols');
- var ObjectProto$1 = Object[PROTOTYPE$2];
- var USE_NATIVE$1 = typeof $Symbol == 'function';
- var QObject = _global.QObject;
- // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
- var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild;
-
- // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
- var setSymbolDesc = _descriptors && _fails(function () {
- return _objectCreate(dP$2({}, 'a', {
- get: function () { return dP$2(this, 'a', { value: 7 }).a; }
- })).a != 7;
- }) ? function (it, key, D) {
- var protoDesc = gOPD$2(ObjectProto$1, key);
- if (protoDesc) delete ObjectProto$1[key];
- dP$2(it, key, D);
- if (protoDesc && it !== ObjectProto$1) dP$2(ObjectProto$1, key, protoDesc);
- } : dP$2;
-
- var wrap = function (tag) {
- var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]);
- sym._k = tag;
- return sym;
- };
-
- var isSymbol = USE_NATIVE$1 && typeof $Symbol.iterator == 'symbol' ? function (it) {
- return typeof it == 'symbol';
- } : function (it) {
- return it instanceof $Symbol;
- };
-
- var $defineProperty = function defineProperty(it, key, D) {
- if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D);
- _anObject(it);
- key = _toPrimitive(key, true);
- _anObject(D);
- if (_has(AllSymbols, key)) {
- if (!D.enumerable) {
- if (!_has(it, HIDDEN)) dP$2(it, HIDDEN, _propertyDesc(1, {}));
- it[HIDDEN][key] = true;
- } else {
- if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
- D = _objectCreate(D, { enumerable: _propertyDesc(0, false) });
- } return setSymbolDesc(it, key, D);
- } return dP$2(it, key, D);
- };
- var $defineProperties = function defineProperties(it, P) {
- _anObject(it);
- var keys = _enumKeys(P = _toIobject(P));
- var i = 0;
- var l = keys.length;
- var key;
- while (l > i) $defineProperty(it, key = keys[i++], P[key]);
- return it;
- };
- var $create = function create(it, P) {
- return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P);
- };
- var $propertyIsEnumerable = function propertyIsEnumerable(key) {
- var E = isEnum.call(this, key = _toPrimitive(key, true));
- if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false;
- return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
- };
- var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
- it = _toIobject(it);
- key = _toPrimitive(key, true);
- if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return;
- var D = gOPD$2(it, key);
- if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
- return D;
- };
- var $getOwnPropertyNames = function getOwnPropertyNames(it) {
- var names = gOPN$1(_toIobject(it));
- var result = [];
- var i = 0;
- var key;
- while (names.length > i) {
- if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
- } return result;
- };
- var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
- var IS_OP = it === ObjectProto$1;
- var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it));
- var result = [];
- var i = 0;
- var key;
- while (names.length > i) {
- if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]);
- } return result;
- };
-
- // 19.4.1.1 Symbol([description])
- if (!USE_NATIVE$1) {
- $Symbol = function Symbol() {
- if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
- var tag = _uid(arguments.length > 0 ? arguments[0] : undefined);
- var $set = function (value) {
- if (this === ObjectProto$1) $set.call(OPSymbols, value);
- if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
- setSymbolDesc(this, tag, _propertyDesc(1, value));
- };
- if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set });
- return wrap(tag);
- };
- _redefine($Symbol[PROTOTYPE$2], 'toString', function toString() {
- return this._k;
- });
-
- _objectGopd.f = $getOwnPropertyDescriptor;
- _objectDp.f = $defineProperty;
- _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames;
- _objectPie.f = $propertyIsEnumerable;
- _objectGops.f = $getOwnPropertySymbols;
-
- if (_descriptors && !_library) {
- _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true);
- }
-
- _wksExt.f = function (name) {
- return wrap(_wks(name));
- };
- }
-
- _export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Symbol: $Symbol });
-
- for (var es6Symbols = (
- // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
- 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
- ).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]);
-
- for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]);
-
- _export(_export.S + _export.F * !USE_NATIVE$1, 'Symbol', {
- // 19.4.2.1 Symbol.for(key)
- 'for': function (key) {
- return _has(SymbolRegistry, key += '')
- ? SymbolRegistry[key]
- : SymbolRegistry[key] = $Symbol(key);
- },
- // 19.4.2.5 Symbol.keyFor(sym)
- keyFor: function keyFor(sym) {
- if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
- for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
- },
- useSetter: function () { setter = true; },
- useSimple: function () { setter = false; }
- });
-
- _export(_export.S + _export.F * !USE_NATIVE$1, 'Object', {
- // 19.1.2.2 Object.create(O [, Properties])
- create: $create,
- // 19.1.2.4 Object.defineProperty(O, P, Attributes)
- defineProperty: $defineProperty,
- // 19.1.2.3 Object.defineProperties(O, Properties)
- defineProperties: $defineProperties,
- // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
- getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
- // 19.1.2.7 Object.getOwnPropertyNames(O)
- getOwnPropertyNames: $getOwnPropertyNames,
- // 19.1.2.8 Object.getOwnPropertySymbols(O)
- getOwnPropertySymbols: $getOwnPropertySymbols
- });
-
- // 24.3.2 JSON.stringify(value [, replacer [, space]])
- $JSON && _export(_export.S + _export.F * (!USE_NATIVE$1 || _fails(function () {
- var S = $Symbol();
- // MS Edge converts symbol values to JSON as {}
- // WebKit converts symbol values to JSON as null
- // V8 throws on boxed symbols
- return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
- })), 'JSON', {
- stringify: function stringify(it) {
- var args = [it];
- var i = 1;
- var replacer, $replacer;
- while (arguments.length > i) args.push(arguments[i++]);
- $replacer = replacer = args[1];
- if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
- if (!_isArray(replacer)) replacer = function (key, value) {
- if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
- if (!isSymbol(value)) return value;
- };
- args[1] = replacer;
- return _stringify.apply($JSON, args);
- }
- });
-
- // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
- $Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf);
- // 19.4.3.5 Symbol.prototype[@@toStringTag]
- _setToStringTag($Symbol, 'Symbol');
- // 20.2.1.9 Math[@@toStringTag]
- _setToStringTag(Math, 'Math', true);
- // 24.3.3 JSON[@@toStringTag]
- _setToStringTag(_global.JSON, 'JSON', true);
-
- // most Object methods by ES6 should accept primitives
-
-
-
- var _objectSap = function (KEY, exec) {
- var fn = (_core.Object || {})[KEY] || Object[KEY];
- var exp = {};
- exp[KEY] = exec(fn);
- _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp);
- };
-
- // 19.1.2.5 Object.freeze(O)
-
- var meta = _meta.onFreeze;
-
- _objectSap('freeze', function ($freeze) {
- return function freeze(it) {
- return $freeze && _isObject(it) ? $freeze(meta(it)) : it;
- };
- });
-
- // 19.1.2.17 Object.seal(O)
-
- var meta$1 = _meta.onFreeze;
-
- _objectSap('seal', function ($seal) {
- return function seal(it) {
- return $seal && _isObject(it) ? $seal(meta$1(it)) : it;
- };
- });
-
- // 19.1.2.15 Object.preventExtensions(O)
-
- var meta$2 = _meta.onFreeze;
-
- _objectSap('preventExtensions', function ($preventExtensions) {
- return function preventExtensions(it) {
- return $preventExtensions && _isObject(it) ? $preventExtensions(meta$2(it)) : it;
- };
- });
-
- // 19.1.2.12 Object.isFrozen(O)
-
-
- _objectSap('isFrozen', function ($isFrozen) {
- return function isFrozen(it) {
- return _isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
- };
- });
-
- // 19.1.2.13 Object.isSealed(O)
-
-
- _objectSap('isSealed', function ($isSealed) {
- return function isSealed(it) {
- return _isObject(it) ? $isSealed ? $isSealed(it) : false : true;
- };
- });
-
- // 19.1.2.11 Object.isExtensible(O)
-
-
- _objectSap('isExtensible', function ($isExtensible) {
- return function isExtensible(it) {
- return _isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
- };
- });
-
- // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
-
- var $getOwnPropertyDescriptor$1 = _objectGopd.f;
-
- _objectSap('getOwnPropertyDescriptor', function () {
- return function getOwnPropertyDescriptor(it, key) {
- return $getOwnPropertyDescriptor$1(_toIobject(it), key);
- };
- });
-
- // 19.1.2.9 Object.getPrototypeOf(O)
-
-
-
- _objectSap('getPrototypeOf', function () {
- return function getPrototypeOf(it) {
- return _objectGpo(_toObject(it));
- };
- });
-
- // 19.1.2.14 Object.keys(O)
-
-
-
- _objectSap('keys', function () {
- return function keys(it) {
- return _objectKeys(_toObject(it));
- };
- });
-
- // 19.1.2.7 Object.getOwnPropertyNames(O)
- _objectSap('getOwnPropertyNames', function () {
- return _objectGopnExt.f;
- });
-
- // 19.1.3.1 Object.assign(target, source)
-
-
- _export(_export.S + _export.F, 'Object', { assign: _objectAssign });
-
- // 7.2.9 SameValue(x, y)
- var _sameValue = Object.is || function is(x, y) {
- // eslint-disable-next-line no-self-compare
- return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
- };
-
- // 19.1.3.10 Object.is(value1, value2)
-
- _export(_export.S, 'Object', { is: _sameValue });
-
- var dP$3 = _objectDp.f;
- var FProto = Function.prototype;
- var nameRE = /^\s*function ([^ (]*)/;
- var NAME = 'name';
-
- // 19.2.4.2 name
- NAME in FProto || _descriptors && dP$3(FProto, NAME, {
- configurable: true,
- get: function () {
- try {
- return ('' + this).match(nameRE)[1];
- } catch (e) {
- return '';
- }
- }
- });
-
- _export(_export.S, 'String', {
- // 21.1.2.4 String.raw(callSite, ...substitutions)
- raw: function raw(callSite) {
- var tpl = _toIobject(callSite.raw);
- var len = _toLength(tpl.length);
- var aLen = arguments.length;
- var res = [];
- var i = 0;
- while (len > i) {
- res.push(String(tpl[i++]));
- if (i < aLen) res.push(String(arguments[i]));
- } return res.join('');
- }
- });
-
- var fromCharCode = String.fromCharCode;
- var $fromCodePoint = String.fromCodePoint;
-
- // length should be 1, old FF problem
- _export(_export.S + _export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
- // 21.1.2.2 String.fromCodePoint(...codePoints)
- fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars
- var res = [];
- var aLen = arguments.length;
- var i = 0;
- var code;
- while (aLen > i) {
- code = +arguments[i++];
- if (_toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
- res.push(code < 0x10000
- ? fromCharCode(code)
- : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
- );
- } return res.join('');
- }
- });
-
- // true -> String#at
- // false -> String#codePointAt
- var _stringAt = function (TO_STRING) {
- return function (that, pos) {
- var s = String(_defined(that));
- var i = _toInteger(pos);
- var l = s.length;
- var a, b;
- if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
- a = s.charCodeAt(i);
- return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
- ? TO_STRING ? s.charAt(i) : a
- : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
- };
- };
-
- var $at = _stringAt(false);
- _export(_export.P, 'String', {
- // 21.1.3.3 String.prototype.codePointAt(pos)
- codePointAt: function codePointAt(pos) {
- return $at(this, pos);
- }
- });
-
- var _stringRepeat = function repeat(count) {
- var str = String(_defined(this));
- var res = '';
- var n = _toInteger(count);
- if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");
- for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;
- return res;
- };
-
- _export(_export.P, 'String', {
- // 21.1.3.13 String.prototype.repeat(count)
- repeat: _stringRepeat
- });
-
- // 7.2.8 IsRegExp(argument)
-
-
- var MATCH = _wks('match');
- var _isRegexp = function (it) {
- var isRegExp;
- return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp');
- };
-
- // helper for String#{startsWith, endsWith, includes}
-
-
-
- var _stringContext = function (that, searchString, NAME) {
- if (_isRegexp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
- return String(_defined(that));
- };
-
- var MATCH$1 = _wks('match');
- var _failsIsRegexp = function (KEY) {
- var re = /./;
- try {
- '/./'[KEY](re);
- } catch (e) {
- try {
- re[MATCH$1] = false;
- return !'/./'[KEY](re);
- } catch (f) { /* empty */ }
- } return true;
- };
-
- var STARTS_WITH = 'startsWith';
- var $startsWith = ''[STARTS_WITH];
-
- _export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', {
- startsWith: function startsWith(searchString /* , position = 0 */) {
- var that = _stringContext(this, searchString, STARTS_WITH);
- var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
- var search = String(searchString);
- return $startsWith
- ? $startsWith.call(that, search, index)
- : that.slice(index, index + search.length) === search;
- }
- });
-
- var ENDS_WITH = 'endsWith';
- var $endsWith = ''[ENDS_WITH];
-
- _export(_export.P + _export.F * _failsIsRegexp(ENDS_WITH), 'String', {
- endsWith: function endsWith(searchString /* , endPosition = @length */) {
- var that = _stringContext(this, searchString, ENDS_WITH);
- var endPosition = arguments.length > 1 ? arguments[1] : undefined;
- var len = _toLength(that.length);
- var end = endPosition === undefined ? len : Math.min(_toLength(endPosition), len);
- var search = String(searchString);
- return $endsWith
- ? $endsWith.call(that, search, end)
- : that.slice(end - search.length, end) === search;
- }
- });
-
- var INCLUDES = 'includes';
-
- _export(_export.P + _export.F * _failsIsRegexp(INCLUDES), 'String', {
- includes: function includes(searchString /* , position = 0 */) {
- return !!~_stringContext(this, searchString, INCLUDES)
- .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
- }
- });
-
- // 21.2.5.3 get RegExp.prototype.flags
-
- var _flags = function () {
- var that = _anObject(this);
- var result = '';
- if (that.global) result += 'g';
- if (that.ignoreCase) result += 'i';
- if (that.multiline) result += 'm';
- if (that.unicode) result += 'u';
- if (that.sticky) result += 'y';
- return result;
- };
-
- // 21.2.5.3 get RegExp.prototype.flags()
- if (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', {
- configurable: true,
- get: _flags
- });
-
- var _fixReWks = function (KEY, length, exec) {
- var SYMBOL = _wks(KEY);
- var fns = exec(_defined, SYMBOL, ''[KEY]);
- var strfn = fns[0];
- var rxfn = fns[1];
- if (_fails(function () {
- var O = {};
- O[SYMBOL] = function () { return 7; };
- return ''[KEY](O) != 7;
- })) {
- _redefine(String.prototype, KEY, strfn);
- _hide(RegExp.prototype, SYMBOL, length == 2
- // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
- // 21.2.5.11 RegExp.prototype[@@split](string, limit)
- ? function (string, arg) { return rxfn.call(string, this, arg); }
- // 21.2.5.6 RegExp.prototype[@@match](string)
- // 21.2.5.9 RegExp.prototype[@@search](string)
- : function (string) { return rxfn.call(string, this); }
- );
- }
- };
-
- // @@match logic
- _fixReWks('match', 1, function (defined, MATCH, $match) {
- // 21.1.3.11 String.prototype.match(regexp)
- return [function match(regexp) {
- var O = defined(this);
- var fn = regexp == undefined ? undefined : regexp[MATCH];
- return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
- }, $match];
- });
-
- // @@replace logic
- _fixReWks('replace', 2, function (defined, REPLACE, $replace) {
- // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)
- return [function replace(searchValue, replaceValue) {
- var O = defined(this);
- var fn = searchValue == undefined ? undefined : searchValue[REPLACE];
- return fn !== undefined
- ? fn.call(searchValue, O, replaceValue)
- : $replace.call(String(O), searchValue, replaceValue);
- }, $replace];
- });
-
- // @@split logic
- _fixReWks('split', 2, function (defined, SPLIT, $split) {
- var isRegExp = _isRegexp;
- var _split = $split;
- var $push = [].push;
- var $SPLIT = 'split';
- var LENGTH = 'length';
- var LAST_INDEX = 'lastIndex';
- if (
- 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||
- 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||
- 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||
- '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||
- '.'[$SPLIT](/()()/)[LENGTH] > 1 ||
- ''[$SPLIT](/.?/)[LENGTH]
- ) {
- var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group
- // based on es5-shim implementation, need to rework it
- $split = function (separator, limit) {
- var string = String(this);
- if (separator === undefined && limit === 0) return [];
- // If `separator` is not a regex, use native split
- if (!isRegExp(separator)) return _split.call(string, separator, limit);
- var output = [];
- var flags = (separator.ignoreCase ? 'i' : '') +
- (separator.multiline ? 'm' : '') +
- (separator.unicode ? 'u' : '') +
- (separator.sticky ? 'y' : '');
- var lastLastIndex = 0;
- var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;
- // Make `global` and avoid `lastIndex` issues by working with a copy
- var separatorCopy = new RegExp(separator.source, flags + 'g');
- var separator2, match, lastIndex, lastLength, i;
- // Doesn't need flags gy, but they don't hurt
- if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
- while (match = separatorCopy.exec(string)) {
- // `separatorCopy.lastIndex` is not reliable cross-browser
- lastIndex = match.index + match[0][LENGTH];
- if (lastIndex > lastLastIndex) {
- output.push(string.slice(lastLastIndex, match.index));
- // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG
- // eslint-disable-next-line no-loop-func
- if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {
- for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;
- });
- if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
- lastLength = match[0][LENGTH];
- lastLastIndex = lastIndex;
- if (output[LENGTH] >= splitLimit) break;
- }
- if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop
- }
- if (lastLastIndex === string[LENGTH]) {
- if (lastLength || !separatorCopy.test('')) output.push('');
- } else output.push(string.slice(lastLastIndex));
- return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
- };
- // Chakra, V8
- } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
- $split = function (separator, limit) {
- return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);
- };
- }
- // 21.1.3.17 String.prototype.split(separator, limit)
- return [function split(separator, limit) {
- var O = defined(this);
- var fn = separator == undefined ? undefined : separator[SPLIT];
- return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);
- }, $split];
- });
-
- // @@search logic
- _fixReWks('search', 1, function (defined, SEARCH, $search) {
- // 21.1.3.15 String.prototype.search(regexp)
- return [function search(regexp) {
- var O = defined(this);
- var fn = regexp == undefined ? undefined : regexp[SEARCH];
- return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
- }, $search];
- });
-
- var _createProperty = function (object, index, value) {
- if (index in object) _objectDp.f(object, index, _propertyDesc(0, value));
- else object[index] = value;
- };
-
- _export(_export.S + _export.F * !_iterDetect(function (iter) { }), 'Array', {
- // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
- from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
- var O = _toObject(arrayLike);
- var C = typeof this == 'function' ? this : Array;
- var aLen = arguments.length;
- var mapfn = aLen > 1 ? arguments[1] : undefined;
- var mapping = mapfn !== undefined;
- var index = 0;
- var iterFn = core_getIteratorMethod(O);
- var length, result, step, iterator;
- if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
- // if object isn't iterable or it's array with default iterator - use simple case
- if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) {
- for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
- _createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value);
- }
- } else {
- length = _toLength(O.length);
- for (result = new C(length); length > index; index++) {
- _createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
- }
- }
- result.length = index;
- return result;
- }
- });
-
- // WebKit Array.of isn't generic
- _export(_export.S + _export.F * _fails(function () {
- function F() { /* empty */ }
- return !(Array.of.call(F) instanceof F);
- }), 'Array', {
- // 22.1.2.3 Array.of( ...items)
- of: function of(/* ...args */) {
- var index = 0;
- var aLen = arguments.length;
- var result = new (typeof this == 'function' ? this : Array)(aLen);
- while (aLen > index) _createProperty(result, index, arguments[index++]);
- result.length = aLen;
- return result;
- }
- });
-
- // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
-
-
- _export(_export.P, 'Array', { copyWithin: _arrayCopyWithin });
-
- _addToUnscopables('copyWithin');
-
- // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)
-
- var $find = _arrayMethods(5);
- var KEY = 'find';
- var forced = true;
- // Shouldn't skip holes
- if (KEY in []) Array(1)[KEY](function () { forced = false; });
- _export(_export.P + _export.F * forced, 'Array', {
- find: function find(callbackfn /* , that = undefined */) {
- return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- }
- });
- _addToUnscopables(KEY);
-
- // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)
-
- var $find$1 = _arrayMethods(6);
- var KEY$1 = 'findIndex';
- var forced$1 = true;
- // Shouldn't skip holes
- if (KEY$1 in []) Array(1)[KEY$1](function () { forced$1 = false; });
- _export(_export.P + _export.F * forced$1, 'Array', {
- findIndex: function findIndex(callbackfn /* , that = undefined */) {
- return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- }
- });
- _addToUnscopables(KEY$1);
-
- // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
-
-
- _export(_export.P, 'Array', { fill: _arrayFill });
-
- _addToUnscopables('fill');
- // 20.1.2.2 Number.isFinite(number)
+ on.call(this, container, transitionEndEvent, restore); // Set dimensions to target
- var _isFinite = _global.isFinite;
+ container.style.width = "".concat(size.width, "px");
+ container.style.height = "".concat(size.height, "px");
+ } // Set attributes on current tab
- _export(_export.S, 'Number', {
- isFinite: function isFinite(it) {
- return typeof it == 'number' && _isFinite(it);
- }
- });
- // 20.1.2.3 Number.isInteger(number)
+ toggleHidden(current, true); // Set attributes on target
- var floor$1 = Math.floor;
- var _isInteger = function isInteger(it) {
- return !_isObject(it) && isFinite(it) && floor$1(it) === it;
- };
+ toggleHidden(target, false); // Focus the first item
- // 20.1.2.3 Number.isInteger(number)
+ controls.focusFirstMenuItem.call(this, target, tabFocus);
+ },
+ // Build the default HTML
+ // TODO: Set order based on order in the config.controls array?
+ create: function create(data) {
+ var _this9 = this;
+ // Create the container
+ var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button
- _export(_export.S, 'Number', { isInteger: _isInteger });
+ if (this.config.controls.includes('restart')) {
+ container.appendChild(controls.createButton.call(this, 'restart'));
+ } // Rewind button
- // 20.1.2.5 Number.isSafeInteger(number)
+ if (this.config.controls.includes('rewind')) {
+ container.appendChild(controls.createButton.call(this, 'rewind'));
+ } // Play/Pause button
- var abs = Math.abs;
- _export(_export.S, 'Number', {
- isSafeInteger: function isSafeInteger(number) {
- return _isInteger(number) && abs(number) <= 0x1fffffffffffff;
- }
- });
+ if (this.config.controls.includes('play')) {
+ container.appendChild(controls.createButton.call(this, 'play'));
+ } // Fast forward button
- // 20.1.2.4 Number.isNaN(number)
+ if (this.config.controls.includes('fast-forward')) {
+ container.appendChild(controls.createButton.call(this, 'fast-forward'));
+ } // Progress
- _export(_export.S, 'Number', {
- isNaN: function isNaN(number) {
- // eslint-disable-next-line no-self-compare
- return number != number;
- }
- });
- // 20.1.2.1 Number.EPSILON
+ if (this.config.controls.includes('progress')) {
+ var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider
+ progress.appendChild(controls.createRange.call(this, 'seek', {
+ id: "plyr-seek-".concat(data.id)
+ })); // Buffer progress
- _export(_export.S, 'Number', { EPSILON: Math.pow(2, -52) });
+ progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator
+ // Seek tooltip
- // 20.1.2.10 Number.MIN_SAFE_INTEGER
+ if (this.config.tooltips.seek) {
+ var tooltip = createElement('span', {
+ class: this.config.classNames.tooltip
+ }, '00:00');
+ progress.appendChild(tooltip);
+ this.elements.display.seekTooltip = tooltip;
+ }
+ this.elements.progress = progress;
+ container.appendChild(this.elements.progress);
+ } // Media current time display
- _export(_export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });
- // 20.1.2.6 Number.MAX_SAFE_INTEGER
+ if (this.config.controls.includes('current-time')) {
+ container.appendChild(controls.createTime.call(this, 'currentTime'));
+ } // Media duration display
- _export(_export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });
+ if (this.config.controls.includes('duration')) {
+ container.appendChild(controls.createTime.call(this, 'duration'));
+ } // Volume controls
- // 20.2.2.20 Math.log1p(x)
- var _mathLog1p = Math.log1p || function log1p(x) {
- return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);
- };
- // 20.2.2.3 Math.acosh(x)
+ if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {
+ var volume = createElement('div', {
+ class: 'plyr__volume'
+ }); // Toggle mute button
+ if (this.config.controls.includes('mute')) {
+ volume.appendChild(controls.createButton.call(this, 'mute'));
+ } // Volume range control
- var sqrt = Math.sqrt;
- var $acosh = Math.acosh;
- _export(_export.S + _export.F * !($acosh
- // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
- && Math.floor($acosh(Number.MAX_VALUE)) == 710
- // Tor Browser bug: Math.acosh(Infinity) -> NaN
- && $acosh(Infinity) == Infinity
- ), 'Math', {
- acosh: function acosh(x) {
- return (x = +x) < 1 ? NaN : x > 94906265.62425156
- ? Math.log(x) + Math.LN2
- : _mathLog1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
- }
- });
+ if (this.config.controls.includes('volume')) {
+ // Set the attributes
+ var attributes = {
+ max: 1,
+ step: 0.05,
+ value: this.config.volume
+ }; // Create the volume range slider
- // 20.2.2.5 Math.asinh(x)
+ volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {
+ id: "plyr-volume-".concat(data.id)
+ })));
+ this.elements.volume = volume;
+ }
- var $asinh = Math.asinh;
+ container.appendChild(volume);
+ } // Toggle captions button
- function asinh(x) {
- return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
- }
- // Tor Browser bug: Math.asinh(0) -> -0
- _export(_export.S + _export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });
+ if (this.config.controls.includes('captions')) {
+ container.appendChild(controls.createButton.call(this, 'captions'));
+ } // Settings button / menu
+
+
+ if (this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {
+ var control = createElement('div', {
+ class: 'plyr__menu',
+ hidden: ''
+ });
+ control.appendChild(controls.createButton.call(this, 'settings', {
+ 'aria-haspopup': true,
+ 'aria-controls': "plyr-settings-".concat(data.id),
+ 'aria-expanded': false
+ }));
+ var popup = createElement('div', {
+ class: 'plyr__menu__container',
+ id: "plyr-settings-".concat(data.id),
+ hidden: ''
+ });
+ var inner = createElement('div');
+ var home = createElement('div', {
+ id: "plyr-settings-".concat(data.id, "-home")
+ }); // Create the menu
+
+ var menu = createElement('div', {
+ role: 'menu'
+ });
+ home.appendChild(menu);
+ inner.appendChild(home);
+ this.elements.settings.panels.home = home; // Build the menu items
+
+ this.config.settings.forEach(function (type) {
+ // TODO: bundle this with the createMenuItem helper and bindings
+ var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), {
+ type: 'button',
+ class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--forward"),
+ role: 'menuitem',
+ 'aria-haspopup': true,
+ hidden: ''
+ })); // Bind menu shortcuts for keyboard users
+
+ controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click
+
+ on(menuItem, 'click', function () {
+ controls.showMenuPanel.call(_this9, type, false);
+ });
+ var flex = createElement('span', null, i18n.get(type, _this9.config));
+ var value = createElement('span', {
+ class: _this9.config.classNames.menu.value
+ }); // Speed contains HTML entities
+
+ value.innerHTML = data[type];
+ flex.appendChild(value);
+ menuItem.appendChild(flex);
+ menu.appendChild(menuItem); // Build the panes
+
+ var pane = createElement('div', {
+ id: "plyr-settings-".concat(data.id, "-").concat(type),
+ hidden: ''
+ }); // Back button
+
+ var backButton = createElement('button', {
+ type: 'button',
+ class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--back")
+ }); // Visible label
+
+ backButton.appendChild(createElement('span', {
+ 'aria-hidden': true
+ }, i18n.get(type, _this9.config))); // Screen reader label
+
+ backButton.appendChild(createElement('span', {
+ class: _this9.config.classNames.hidden
+ }, i18n.get('menuBack', _this9.config))); // Go back via keyboard
+
+ on(pane, 'keydown', function (event) {
+ // We only care about <-
+ if (event.which !== 37) {
+ return;
+ } // Prevent seek
+
+
+ event.preventDefault();
+ event.stopPropagation(); // Show the respective menu
+
+ controls.showMenuPanel.call(_this9, 'home', true);
+ }, false); // Go back via button click
+
+ on(backButton, 'click', function () {
+ controls.showMenuPanel.call(_this9, 'home', false);
+ }); // Add to pane
+
+ pane.appendChild(backButton); // Menu
+
+ pane.appendChild(createElement('div', {
+ role: 'menu'
+ }));
+ inner.appendChild(pane);
+ _this9.elements.settings.buttons[type] = menuItem;
+ _this9.elements.settings.panels[type] = pane;
+ });
+ popup.appendChild(inner);
+ control.appendChild(popup);
+ container.appendChild(control);
+ this.elements.settings.popup = popup;
+ this.elements.settings.menu = control;
+ } // Picture in picture button
+
+
+ if (this.config.controls.includes('pip') && support.pip) {
+ container.appendChild(controls.createButton.call(this, 'pip'));
+ } // Airplay button
+
+
+ if (this.config.controls.includes('airplay') && support.airplay) {
+ container.appendChild(controls.createButton.call(this, 'airplay'));
+ } // Toggle fullscreen button
+
+
+ if (this.config.controls.includes('fullscreen')) {
+ container.appendChild(controls.createButton.call(this, 'fullscreen'));
+ } // Larger overlaid play button
+
- // 20.2.2.7 Math.atanh(x)
+ if (this.config.controls.includes('play-large')) {
+ this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));
+ }
- var $atanh = Math.atanh;
+ this.elements.controls = container; // Set available quality levels
- // Tor Browser bug: Math.atanh(-0) -> 0
- _export(_export.S + _export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {
- atanh: function atanh(x) {
- return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
- }
- });
+ if (this.isHTML5) {
+ controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));
+ }
- // 20.2.2.28 Math.sign(x)
- var _mathSign = Math.sign || function sign(x) {
- // eslint-disable-next-line no-self-compare
- return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
- };
+ controls.setSpeedMenu.call(this);
+ return container;
+ },
+ // Insert controls
+ inject: function inject() {
+ var _this10 = this;
- // 20.2.2.9 Math.cbrt(x)
+ // Sprite
+ if (this.config.loadSprite) {
+ var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX
+
+ if (icon.cors) {
+ loadSprite(icon.url, 'sprite-plyr');
+ }
+ } // Create a unique ID
+ this.id = Math.floor(Math.random() * 10000); // Null by default
- _export(_export.S, 'Math', {
- cbrt: function cbrt(x) {
- return _mathSign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
- }
- });
+ var container = null;
+ this.elements.controls = null; // Set template properties
- // 20.2.2.11 Math.clz32(x)
+ var props = {
+ id: this.id,
+ seektime: this.config.seekTime,
+ title: this.config.title
+ };
+ var update = true; // If function, run it and use output
+ if (is$1.function(this.config.controls)) {
+ this.config.controls = this.config.controls.call(this.props);
+ } // Convert falsy controls to empty array (primarily for empty strings)
- _export(_export.S, 'Math', {
- clz32: function clz32(x) {
- return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
- }
- });
- // 20.2.2.12 Math.cosh(x)
+ if (!this.config.controls) {
+ this.config.controls = [];
+ }
- var exp = Math.exp;
+ if (is$1.element(this.config.controls) || is$1.string(this.config.controls)) {
+ // HTMLElement or Non-empty string passed as the option
+ container = this.config.controls;
+ } else {
+ // Create controls
+ container = controls.create.call(this, {
+ id: this.id,
+ seektime: this.config.seekTime,
+ speed: this.speed,
+ quality: this.quality,
+ captions: captions.getLabel.call(this) // TODO: Looping
+ // loop: 'None',
+
+ });
+ update = false;
+ } // Replace props with their value
+
+
+ var replace = function replace(input) {
+ var result = input;
+ Object.entries(props).forEach(function (_ref2) {
+ var _ref3 = _slicedToArray(_ref2, 2),
+ key = _ref3[0],
+ value = _ref3[1];
+
+ result = replaceAll(result, "{".concat(key, "}"), value);
+ });
+ return result;
+ }; // Update markup
+
+
+ if (update) {
+ if (is$1.string(this.config.controls)) {
+ container = replace(container);
+ } else if (is$1.element(container)) {
+ container.innerHTML = replace(container.innerHTML);
+ }
+ } // Controls container
+
+
+ var target; // Inject to custom location
+
+ if (is$1.string(this.config.selectors.controls.container)) {
+ target = document.querySelector(this.config.selectors.controls.container);
+ } // Inject into the container by default
+
+
+ if (!is$1.element(target)) {
+ target = this.elements.container;
+ } // Inject controls HTML (needs to be before captions, hence "afterbegin")
+
+
+ var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';
+ target[insertMethod]('afterbegin', container); // Find the elements if need be
+
+ if (!is$1.element(this.elements.controls)) {
+ controls.findElements.call(this);
+ } // Add pressed property to buttons
+
+
+ if (!is$1.empty(this.elements.buttons)) {
+ var addProperty = function addProperty(button) {
+ var className = _this10.config.classNames.controlPressed;
+ Object.defineProperty(button, 'pressed', {
+ enumerable: true,
+ get: function get() {
+ return hasClass(button, className);
+ },
+ set: function set() {
+ var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ toggleClass(button, className, pressed);
+ }
+ });
+ }; // Toggle classname when pressed property is set
+
+
+ Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {
+ if (is$1.array(button) || is$1.nodeList(button)) {
+ Array.from(button).filter(Boolean).forEach(addProperty);
+ } else {
+ addProperty(button);
+ }
+ });
+ } // Edge sometimes doesn't finish the paint so force a redraw
+
+
+ if (window.navigator.userAgent.includes('Edge')) {
+ repaint(target);
+ } // Setup tooltips
+
+
+ if (this.config.tooltips.controls) {
+ var _this$config = this.config,
+ classNames = _this$config.classNames,
+ selectors = _this$config.selectors;
+ var selector = "".concat(selectors.controls.wrapper, " ").concat(selectors.labels, " .").concat(classNames.hidden);
+ var labels = getElements.call(this, selector);
+ Array.from(labels).forEach(function (label) {
+ toggleClass(label, _this10.config.classNames.hidden, false);
+ toggleClass(label, _this10.config.classNames.tooltip, true);
+ });
+ }
+ }
+ };
+
+ /**
+ * Parse a string to a URL object
+ * @param {string} input - the URL to be parsed
+ * @param {boolean} safe - failsafe parsing
+ */
+
+ function parseUrl(input) {
+ var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ var url = input;
+
+ if (safe) {
+ var parser = document.createElement('a');
+ parser.href = url;
+ url = parser.href;
+ }
+
+ try {
+ return new URL(url);
+ } catch (e) {
+ return null;
+ }
+ } // Convert object to URLSearchParams
+
+ function buildUrlParams(input) {
+ var params = new URLSearchParams();
+
+ if (is$1.object(input)) {
+ Object.entries(input).forEach(function (_ref) {
+ var _ref2 = _slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
+
+ params.set(key, value);
+ });
+ }
+
+ return params;
+ }
+
+ var captions = {
+ // Setup captions
+ setup: function setup() {
+ // Requires UI support
+ if (!this.supported.ui) {
+ return;
+ } // Only Vimeo and HTML5 video supported at this point
+
+
+ if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
+ // Clear menu and hide
+ if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
+ controls.setCaptionsMenu.call(this);
+ }
+
+ return;
+ } // Inject the container
+
+
+ if (!is$1.element(this.elements.captions)) {
+ this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
+ insertAfter(this.elements.captions, this.elements.wrapper);
+ } // Fix IE captions if CORS is used
+ // Fetch captions and inject as blobs instead (data URIs not supported!)
+
+
+ if (browser.isIE && window.URL) {
+ var elements = this.media.querySelectorAll('track');
+ Array.from(elements).forEach(function (track) {
+ var src = track.getAttribute('src');
+ var url = parseUrl(src);
+
+ if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
+ fetch(src, 'blob').then(function (blob) {
+ track.setAttribute('src', window.URL.createObjectURL(blob));
+ }).catch(function () {
+ removeElement(track);
+ });
+ }
+ });
+ } // Get and set initial data
+ // The "preferred" options are not realized unless / until the wanted language has a match
+ // * languages: Array of user's browser languages.
+ // * language: The language preferred by user settings or config
+ // * active: The state preferred by user settings or config
+ // * toggled: The real captions state
+
+
+ var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];
+ var languages = dedupe(browserLanguages.map(function (language) {
+ return language.split('-')[0];
+ }));
+ var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'
+
+ if (language === 'auto') {
+ var _languages = _slicedToArray(languages, 1);
+
+ language = _languages[0];
+ }
+
+ var active = this.storage.get('captions');
+
+ if (!is$1.boolean(active)) {
+ active = this.config.captions.active;
+ }
+
+ Object.assign(this.captions, {
+ toggled: false,
+ active: active,
+ language: language,
+ languages: languages
+ }); // Watch changes to textTracks and update captions menu
+
+ if (this.isHTML5) {
+ var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
+ on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
+ } // Update available languages in list next tick (the event must not be triggered before the listeners)
- _export(_export.S, 'Math', {
- cosh: function cosh(x) {
- return (exp(x = +x) + exp(-x)) / 2;
- }
- });
- // 20.2.2.14 Math.expm1(x)
- var $expm1 = Math.expm1;
- var _mathExpm1 = (!$expm1
- // Old FF bug
- || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168
- // Tor Browser bug
- || $expm1(-2e-17) != -2e-17
- ) ? function expm1(x) {
- return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;
- } : $expm1;
+ setTimeout(captions.update.bind(this), 0);
+ },
+ // Update available language options in settings based on tracks
+ update: function update() {
+ var _this = this;
- // 20.2.2.14 Math.expm1(x)
+ var tracks = captions.getTracks.call(this, true); // Get the wanted language
+ var _this$captions = this.captions,
+ active = _this$captions.active,
+ language = _this$captions.language,
+ meta = _this$captions.meta,
+ currentTrackNode = _this$captions.currentTrackNode;
+ var languageExists = Boolean(tracks.find(function (track) {
+ return track.language === language;
+ })); // Handle tracks (add event listener and "pseudo"-default)
+ if (this.isHTML5 && this.isVideo) {
+ tracks.filter(function (track) {
+ return !meta.get(track);
+ }).forEach(function (track) {
+ _this.debug.log('Track added', track); // Attempt to store if the original dom element was "default"
+
+
+ meta.set(track, {
+ default: track.mode === 'showing'
+ }); // Turn off native caption rendering to avoid double captions
- _export(_export.S + _export.F * (_mathExpm1 != Math.expm1), 'Math', { expm1: _mathExpm1 });
+ track.mode = 'hidden'; // Add event listener for cue changes
- // 20.2.2.16 Math.fround(x)
+ on.call(_this, track, 'cuechange', function () {
+ return captions.updateCues.call(_this);
+ });
+ });
+ } // Update language first time it matches, or if the previous matching track was removed
- var pow = Math.pow;
- var EPSILON = pow(2, -52);
- var EPSILON32 = pow(2, -23);
- var MAX32 = pow(2, 127) * (2 - EPSILON32);
- var MIN32 = pow(2, -126);
- var roundTiesToEven = function (n) {
- return n + 1 / EPSILON - 1 / EPSILON;
- };
+ if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {
+ captions.setLanguage.call(this, language);
+ captions.toggle.call(this, active && languageExists);
+ } // Enable or disable captions based on track length
- var _mathFround = Math.fround || function fround(x) {
- var $abs = Math.abs(x);
- var $sign = _mathSign(x);
- var a, result;
- if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
- a = (1 + EPSILON32 / EPSILON) * $abs;
- result = a - (a - $abs);
- // eslint-disable-next-line no-self-compare
- if (result > MAX32 || result != result) return $sign * Infinity;
- return $sign * result;
- };
- // 20.2.2.16 Math.fround(x)
+ toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list
+ if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
+ controls.setCaptionsMenu.call(this);
+ }
+ },
+ // Toggle captions display
+ // Used internally for the toggleCaptions method, with the passive option forced to false
+ toggle: function toggle(input) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- _export(_export.S, 'Math', { fround: _mathFround });
+ // If there's no full support
+ if (!this.supported.ui) {
+ return;
+ }
- // 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
+ var toggled = this.captions.toggled; // Current state
- var abs$1 = Math.abs;
+ var activeClass = this.config.classNames.captions.active; // Get the next state
+ // If the method is called without parameter, toggle based on current value
- _export(_export.S, 'Math', {
- hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars
- var sum = 0;
- var i = 0;
- var aLen = arguments.length;
- var larg = 0;
- var arg, div;
- while (i < aLen) {
- arg = abs$1(arguments[i++]);
- if (larg < arg) {
- div = larg / arg;
- sum = sum * div * div + 1;
- larg = arg;
- } else if (arg > 0) {
- div = arg / larg;
- sum += div * div;
- } else sum += arg;
- }
- return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
- }
- });
+ var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event
- // 20.2.2.18 Math.imul(x, y)
+ if (active !== toggled) {
+ // When passive, don't override user preferences
+ if (!passive) {
+ this.captions.active = active;
+ this.storage.set({
+ captions: active
+ });
+ } // Force language if the call isn't passive and there is no matching language to toggle to
- var $imul = Math.imul;
- // some WebKit versions fails with big numbers, some has wrong arity
- _export(_export.S + _export.F * _fails(function () {
- return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
- }), 'Math', {
- imul: function imul(x, y) {
- var UINT16 = 0xffff;
- var xn = +x;
- var yn = +y;
- var xl = UINT16 & xn;
- var yl = UINT16 & yn;
- return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
- }
- });
+ if (!this.language && active && !passive) {
+ var tracks = captions.getTracks.call(this);
+ var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added
- // 20.2.2.20 Math.log1p(x)
+ this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference
+ captions.set.call(this, tracks.indexOf(track));
+ return;
+ } // Toggle button if it's enabled
- _export(_export.S, 'Math', { log1p: _mathLog1p });
- // 20.2.2.21 Math.log10(x)
+ if (this.elements.buttons.captions) {
+ this.elements.buttons.captions.pressed = active;
+ } // Add class hook
- _export(_export.S, 'Math', {
- log10: function log10(x) {
- return Math.log(x) * Math.LOG10E;
- }
- });
+ toggleClass(this.elements.container, activeClass, active);
+ this.captions.toggled = active; // Update settings menu
- // 20.2.2.22 Math.log2(x)
+ controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)
+ triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
+ }
+ },
+ // Set captions by track index
+ // Used internally for the currentTrack setter with the passive option forced to false
+ set: function set(index) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ var tracks = captions.getTracks.call(this); // Disable captions if setting to -1
- _export(_export.S, 'Math', {
- log2: function log2(x) {
- return Math.log(x) / Math.LN2;
- }
- });
+ if (index === -1) {
+ captions.toggle.call(this, false, passive);
+ return;
+ }
- // 20.2.2.28 Math.sign(x)
+ if (!is$1.number(index)) {
+ this.debug.warn('Invalid caption argument', index);
+ return;
+ }
+ if (!(index in tracks)) {
+ this.debug.warn('Track not found', index);
+ return;
+ }
- _export(_export.S, 'Math', { sign: _mathSign });
+ if (this.captions.currentTrack !== index) {
+ this.captions.currentTrack = index;
+ var track = tracks[index];
+
+ var _ref = track || {},
+ language = _ref.language; // Store reference to node for invalidation on remove
- // 20.2.2.30 Math.sinh(x)
+
+ this.captions.currentTrackNode = track; // Update settings menu
+
+ controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences
+
+ if (!passive) {
+ this.captions.language = language;
+ this.storage.set({
+ language: language
+ });
+ } // Handle Vimeo captions
+
+
+ if (this.isVimeo) {
+ this.embed.enableTextTrack(language);
+ } // Trigger event
+
+
+ triggerEvent.call(this, this.media, 'languagechange');
+ } // Show captions
+
+
+ captions.toggle.call(this, true, passive);
+
+ if (this.isHTML5 && this.isVideo) {
+ // If we change the active track while a cue is already displayed we need to update it
+ captions.updateCues.call(this);
+ }
+ },
+ // Set captions by language
+ // Used internally for the language setter with the passive option forced to false
+ setLanguage: function setLanguage(input) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ if (!is$1.string(input)) {
+ this.debug.warn('Invalid language argument', input);
+ return;
+ } // Normalize
+
+
+ var language = input.toLowerCase();
+ this.captions.language = language; // Set currentTrack
+
+ var tracks = captions.getTracks.call(this);
+ var track = captions.findTrack.call(this, [language]);
+ captions.set.call(this, tracks.indexOf(track), passive);
+ },
+ // Get current valid caption tracks
+ // If update is false it will also ignore tracks without metadata
+ // This is used to "freeze" the language options when captions.update is false
+ getTracks: function getTracks() {
+ var _this2 = this;
+
+ var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ // Handle media or textTracks missing or null
+ var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
+ // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
+
+ return tracks.filter(function (track) {
+ return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
+ }).filter(function (track) {
+ return ['captions', 'subtitles'].includes(track.kind);
+ });
+ },
+ // Match tracks based on languages and get the first
+ findTrack: function findTrack(languages) {
+ var _this3 = this;
+
+ var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var tracks = captions.getTracks.call(this);
+
+ var sortIsDefault = function sortIsDefault(track) {
+ return Number((_this3.captions.meta.get(track) || {}).default);
+ };
+
+ var sorted = Array.from(tracks).sort(function (a, b) {
+ return sortIsDefault(b) - sortIsDefault(a);
+ });
+ var track;
+ languages.every(function (language) {
+ track = sorted.find(function (track) {
+ return track.language === language;
+ });
+ return !track; // Break iteration if there is a match
+ }); // If no match is found but is required, get first
+
+ return track || (force ? sorted[0] : undefined);
+ },
+ // Get the current track
+ getCurrentTrack: function getCurrentTrack() {
+ return captions.getTracks.call(this)[this.currentTrack];
+ },
+ // Get UI label for track
+ getLabel: function getLabel(track) {
+ var currentTrack = track;
+
+ if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {
+ currentTrack = captions.getCurrentTrack.call(this);
+ }
+
+ if (is$1.track(currentTrack)) {
+ if (!is$1.empty(currentTrack.label)) {
+ return currentTrack.label;
+ }
+
+ if (!is$1.empty(currentTrack.language)) {
+ return track.language.toUpperCase();
+ }
+
+ return i18n.get('enabled', this.config);
+ }
+
+ return i18n.get('disabled', this.config);
+ },
+ // Update captions using current track's active cues
+ // Also optional array argument in case there isn't any track (ex: vimeo)
+ updateCues: function updateCues(input) {
+ // Requires UI
+ if (!this.supported.ui) {
+ return;
+ }
+
+ if (!is$1.element(this.elements.captions)) {
+ this.debug.warn('No captions element to render to');
+ return;
+ } // Only accept array or empty input
+
+
+ if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {
+ this.debug.warn('updateCues: Invalid input', input);
+ return;
+ }
+
+ var cues = input; // Get cues from track
+
+ if (!cues) {
+ var track = captions.getCurrentTrack.call(this);
+ cues = Array.from((track || {}).activeCues || []).map(function (cue) {
+ return cue.getCueAsHTML();
+ }).map(getHTML);
+ } // Set new caption text
+
+
+ var content = cues.map(function (cueText) {
+ return cueText.trim();
+ }).join('\n');
+ var changed = content !== this.elements.captions.innerHTML;
+
+ if (changed) {
+ // Empty the container and create a new child element
+ emptyElement(this.elements.captions);
+ var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
+ caption.innerHTML = content;
+ this.elements.captions.appendChild(caption); // Trigger event
+
+ triggerEvent.call(this, this.media, 'cuechange');
+ }
+ }
+ };
+
+ // ==========================================================================
+ // Plyr default config
+ // ==========================================================================
+ var defaults = {
+ // Disable
+ enabled: true,
+ // Custom media title
+ title: '',
+ // Logging to console
+ debug: false,
+ // Auto play (if supported)
+ autoplay: false,
+ // Only allow one media playing at once (vimeo only)
+ autopause: true,
+ // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
+ // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
+ playsinline: true,
+ // Default time to skip when rewind/fast forward
+ seekTime: 10,
+ // Default volume
+ volume: 1,
+ muted: false,
+ // Pass a custom duration
+ duration: null,
+ // Display the media duration on load in the current time position
+ // If you have opted to display both duration and currentTime, this is ignored
+ displayDuration: true,
+ // Invert the current time to be a countdown
+ invertTime: true,
+ // Clicking the currentTime inverts it's value to show time left rather than elapsed
+ toggleInvert: true,
+ // Aspect ratio (for embeds)
+ ratio: '16:9',
+ // Click video container to play/pause
+ clickToPlay: true,
+ // Auto hide the controls
+ hideControls: true,
+ // Reset to start when playback ended
+ resetOnEnd: false,
+ // Disable the standard context menu
+ disableContextMenu: true,
+ // Sprite (for icons)
+ loadSprite: true,
+ iconPrefix: 'plyr',
+ iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',
+ // Blank video (used to prevent errors on source change)
+ blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
+ // Quality default
+ quality: {
+ default: 576,
+ options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]
+ },
+ // Set loops
+ loop: {
+ active: false // start: null,
+ // end: null,
+
+ },
+ // Speed default and options to display
+ speed: {
+ selected: 1,
+ options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
+ },
+ // Keyboard shortcut settings
+ keyboard: {
+ focused: true,
+ global: false
+ },
+ // Display tooltips
+ tooltips: {
+ controls: false,
+ seek: true
+ },
+ // Captions settings
+ captions: {
+ active: false,
+ language: 'auto',
+ // Listen to new tracks added after Plyr is initialized.
+ // This is needed for streaming captions, but may result in unselectable options
+ update: false
+ },
+ // Fullscreen settings
+ fullscreen: {
+ enabled: true,
+ // Allow fullscreen?
+ fallback: true,
+ // Fallback for vintage browsers
+ iosNative: false // Use the native fullscreen in iOS (disables custom controls)
+
+ },
+ // Local storage
+ storage: {
+ enabled: true,
+ key: 'plyr'
+ },
+ // Default controls
+ controls: ['play-large', // 'restart',
+ // 'rewind',
+ 'play', // 'fast-forward',
+ 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
+ settings: ['captions', 'quality', 'speed'],
+ // Localisation
+ i18n: {
+ restart: 'Restart',
+ rewind: 'Rewind {seektime}s',
+ play: 'Play',
+ pause: 'Pause',
+ fastForward: 'Forward {seektime}s',
+ seek: 'Seek',
+ seekLabel: '{currentTime} of {duration}',
+ played: 'Played',
+ buffered: 'Buffered',
+ currentTime: 'Current time',
+ duration: 'Duration',
+ volume: 'Volume',
+ mute: 'Mute',
+ unmute: 'Unmute',
+ enableCaptions: 'Enable captions',
+ disableCaptions: 'Disable captions',
+ enterFullscreen: 'Enter fullscreen',
+ exitFullscreen: 'Exit fullscreen',
+ frameTitle: 'Player for {title}',
+ captions: 'Captions',
+ settings: 'Settings',
+ menuBack: 'Go back to previous menu',
+ speed: 'Speed',
+ normal: 'Normal',
+ quality: 'Quality',
+ loop: 'Loop',
+ start: 'Start',
+ end: 'End',
+ all: 'All',
+ reset: 'Reset',
+ disabled: 'Disabled',
+ enabled: 'Enabled',
+ advertisement: 'Ad',
+ qualityBadge: {
+ 2160: '4K',
+ 1440: 'HD',
+ 1080: 'HD',
+ 720: 'HD',
+ 576: 'SD',
+ 480: 'SD'
+ }
+ },
+ // URLs
+ urls: {
+ vimeo: {
+ sdk: 'https://player.vimeo.com/api/player.js',
+ iframe: 'https://player.vimeo.com/video/{0}?{1}',
+ api: 'https://vimeo.com/api/v2/video/{0}.json'
+ },
+ youtube: {
+ sdk: 'https://www.youtube.com/iframe_api',
+ api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'
+ },
+ googleIMA: {
+ sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
+ }
+ },
+ // Custom control listeners
+ listeners: {
+ seek: null,
+ play: null,
+ pause: null,
+ restart: null,
+ rewind: null,
+ fastForward: null,
+ mute: null,
+ volume: null,
+ captions: null,
+ fullscreen: null,
+ pip: null,
+ airplay: null,
+ speed: null,
+ quality: null,
+ loop: null,
+ language: null
+ },
+ // Events to watch and bubble
+ events: [// Events to watch on HTML5 media elements and bubble
+ // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
+ 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events
+ 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube
+ 'statechange', // Quality
+ 'qualitychange', // Ads
+ 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
+ // Selectors
+ // Change these to match your template if using custom HTML
+ selectors: {
+ editable: 'input, textarea, select, [contenteditable]',
+ container: '.plyr',
+ controls: {
+ container: null,
+ wrapper: '.plyr__controls'
+ },
+ labels: '[data-plyr]',
+ buttons: {
+ play: '[data-plyr="play"]',
+ pause: '[data-plyr="pause"]',
+ restart: '[data-plyr="restart"]',
+ rewind: '[data-plyr="rewind"]',
+ fastForward: '[data-plyr="fast-forward"]',
+ mute: '[data-plyr="mute"]',
+ captions: '[data-plyr="captions"]',
+ fullscreen: '[data-plyr="fullscreen"]',
+ pip: '[data-plyr="pip"]',
+ airplay: '[data-plyr="airplay"]',
+ settings: '[data-plyr="settings"]',
+ loop: '[data-plyr="loop"]'
+ },
+ inputs: {
+ seek: '[data-plyr="seek"]',
+ volume: '[data-plyr="volume"]',
+ speed: '[data-plyr="speed"]',
+ language: '[data-plyr="language"]',
+ quality: '[data-plyr="quality"]'
+ },
+ display: {
+ currentTime: '.plyr__time--current',
+ duration: '.plyr__time--duration',
+ buffer: '.plyr__progress__buffer',
+ loop: '.plyr__progress__loop',
+ // Used later
+ volume: '.plyr__volume--display'
+ },
+ progress: '.plyr__progress',
+ captions: '.plyr__captions',
+ caption: '.plyr__caption',
+ menu: {
+ quality: '.js-plyr__menu__list--quality'
+ }
+ },
+ // Class hooks added to the player in different states
+ classNames: {
+ type: 'plyr--{0}',
+ provider: 'plyr--{0}',
+ video: 'plyr__video-wrapper',
+ embed: 'plyr__video-embed',
+ embedContainer: 'plyr__video-embed__container',
+ poster: 'plyr__poster',
+ posterEnabled: 'plyr__poster-enabled',
+ ads: 'plyr__ads',
+ control: 'plyr__control',
+ controlPressed: 'plyr__control--pressed',
+ playing: 'plyr--playing',
+ paused: 'plyr--paused',
+ stopped: 'plyr--stopped',
+ loading: 'plyr--loading',
+ hover: 'plyr--hover',
+ tooltip: 'plyr__tooltip',
+ cues: 'plyr__cues',
+ hidden: 'plyr__sr-only',
+ hideControls: 'plyr--hide-controls',
+ isIos: 'plyr--is-ios',
+ isTouch: 'plyr--is-touch',
+ uiSupported: 'plyr--full-ui',
+ noTransition: 'plyr--no-transition',
+ display: {
+ time: 'plyr__time'
+ },
+ menu: {
+ value: 'plyr__menu__value',
+ badge: 'plyr__badge',
+ open: 'plyr--menu-open'
+ },
+ captions: {
+ enabled: 'plyr--captions-enabled',
+ active: 'plyr--captions-active'
+ },
+ fullscreen: {
+ enabled: 'plyr--fullscreen-enabled',
+ fallback: 'plyr--fullscreen-fallback'
+ },
+ pip: {
+ supported: 'plyr--pip-supported',
+ active: 'plyr--pip-active'
+ },
+ airplay: {
+ supported: 'plyr--airplay-supported',
+ active: 'plyr--airplay-active'
+ },
+ tabFocus: 'plyr__tab-focus'
+ },
+ // Embed attributes
+ attributes: {
+ embed: {
+ provider: 'data-plyr-provider',
+ id: 'data-plyr-embed-id'
+ }
+ },
+ // API keys
+ keys: {
+ google: null
+ },
+ // Advertisements plugin
+ // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
+ ads: {
+ enabled: false,
+ publisherId: ''
+ }
+ };
+
+ // ==========================================================================
+ // Plyr supported types and providers
+ // ==========================================================================
+ var providers = {
+ html5: 'html5',
+ youtube: 'youtube',
+ vimeo: 'vimeo'
+ };
+ var types = {
+ audio: 'audio',
+ video: 'video'
+ };
+ /**
+ * Get provider by URL
+ * @param {string} url
+ */
+
+ function getProviderByUrl(url) {
+ // YouTube
+ if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
+ return providers.youtube;
+ } // Vimeo
+
+
+ if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
+ return providers.vimeo;
+ }
+
+ return null;
+ }
+
+ // ==========================================================================
+ // Console wrapper
+ // ==========================================================================
+ var noop = function noop() {};
+
+ var Console =
+ /*#__PURE__*/
+ function () {
+ function Console() {
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ _classCallCheck(this, Console);
+
+ this.enabled = window.console && enabled;
+
+ if (this.enabled) {
+ this.log('Debugging enabled');
+ }
+ }
+
+ _createClass(Console, [{
+ key: "log",
+ get: function get() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
+ }
+ }, {
+ key: "warn",
+ get: function get() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
+ }
+ }, {
+ key: "error",
+ get: function get() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
+ }
+ }]);
+
+ return Console;
+ }();
+
+ function onChange() {
+ if (!this.enabled) {
+ return;
+ } // Update toggle button
+
+
+ var button = this.player.elements.buttons.fullscreen;
+
+ if (is$1.element(button)) {
+ button.pressed = this.active;
+ } // Trigger an event
+
+
+ triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container
+
+ if (!browser.isIos) {
+ trapFocus.call(this.player, this.target, this.active);
+ }
+ }
+
+ function toggleFallback() {
+ var _this = this;
+
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ // Store or restore scroll position
+ if (toggle) {
+ this.scrollPosition = {
+ x: window.scrollX || 0,
+ y: window.scrollY || 0
+ };
+ } else {
+ window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
+ } // Toggle scroll
- var exp$1 = Math.exp;
+ document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook
- // V8 near Chromium 38 has a problem with very small numbers
- _export(_export.S + _export.F * _fails(function () {
- return !Math.sinh(-2e-17) != -2e-17;
- }), 'Math', {
- sinh: function sinh(x) {
- return Math.abs(x = +x) < 1
- ? (_mathExpm1(x) - _mathExpm1(-x)) / 2
- : (exp$1(x - 1) - exp$1(-x - 1)) * (Math.E / 2);
- }
- });
+ toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
- // 20.2.2.33 Math.tanh(x)
+ if (browser.isIos) {
+ var viewport = document.head.querySelector('meta[name="viewport"]');
+ var property = 'viewport-fit=cover'; // Inject the viewport meta if required
+
+ if (!viewport) {
+ viewport = document.createElement('meta');
+ viewport.setAttribute('name', 'viewport');
+ } // Check if the property already exists
- var exp$2 = Math.exp;
+ var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);
+
+ if (toggle) {
+ this.cleanupViewport = !hasProperty;
+
+ if (!hasProperty) {
+ viewport.content += ",".concat(property);
+ }
+ } else if (this.cleanupViewport) {
+ viewport.content = viewport.content.split(',').filter(function (part) {
+ return part.trim() !== property;
+ }).join(',');
+ } // Force a repaint as sometimes Safari doesn't want to fill the screen
+
+
+ setTimeout(function () {
+ return repaint(_this.target);
+ }, 100);
+ } // Toggle button and fire events
+
+
+ onChange.call(this);
+ }
+
+ var Fullscreen =
+ /*#__PURE__*/
+ function () {
+ function Fullscreen(player) {
+ var _this2 = this;
+
+ _classCallCheck(this, Fullscreen);
+
+ // Keep reference to parent
+ this.player = player; // Get prefix
+
+ this.prefix = Fullscreen.prefix;
+ this.property = Fullscreen.property; // Scroll position
+
+ this.scrollPosition = {
+ x: 0,
+ y: 0
+ }; // Register event listeners
+ // Handle event (incase user presses escape etc)
+
+ on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () {
+ // TODO: Filter for target??
+ onChange.call(_this2);
+ }); // Fullscreen toggle on double click
+
+ on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
+ // Ignore double click in controls
+ if (is$1.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) {
+ return;
+ }
+
+ _this2.toggle();
+ }); // Update the UI
+
+ this.update();
+ } // Determine if native supported
+
+
+ _createClass(Fullscreen, [{
+ key: "update",
+ // Update UI
+ value: function update() {
+ if (this.enabled) {
+ this.player.debug.log("".concat(Fullscreen.native ? 'Native' : 'Fallback', " fullscreen enabled"));
+ } else {
+ this.player.debug.log('Fullscreen not supported and fallback disabled');
+ } // Add styling hook to show button
+
+
+ toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
+ } // Make an element fullscreen
+
+ }, {
+ key: "enter",
+ value: function enter() {
+ if (!this.enabled) {
+ return;
+ } // iOS native fullscreen doesn't need the request step
+
+
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
+ this.target.webkitEnterFullscreen();
+ } else if (!Fullscreen.native) {
+ toggleFallback.call(this, true);
+ } else if (!this.prefix) {
+ this.target.requestFullscreen();
+ } else if (!is$1.empty(this.prefix)) {
+ this.target["".concat(this.prefix, "Request").concat(this.property)]();
+ }
+ } // Bail from fullscreen
+
+ }, {
+ key: "exit",
+ value: function exit() {
+ if (!this.enabled) {
+ return;
+ } // iOS native fullscreen
+
+
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
+ this.target.webkitExitFullscreen();
+ this.player.play();
+ } else if (!Fullscreen.native) {
+ toggleFallback.call(this, false);
+ } else if (!this.prefix) {
+ (document.cancelFullScreen || document.exitFullscreen).call(document);
+ } else if (!is$1.empty(this.prefix)) {
+ var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
+ document["".concat(this.prefix).concat(action).concat(this.property)]();
+ }
+ } // Toggle state
+
+ }, {
+ key: "toggle",
+ value: function toggle() {
+ if (!this.active) {
+ this.enter();
+ } else {
+ this.exit();
+ }
+ }
+ }, {
+ key: "enabled",
+ // Determine if fullscreen is enabled
+ get: function get() {
+ return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
+ } // Get active state
+
+ }, {
+ key: "active",
+ get: function get() {
+ if (!this.enabled) {
+ return false;
+ } // Fallback using classname
+
+
+ if (!Fullscreen.native) {
+ return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
+ }
+
+ var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")];
+ return element === this.target;
+ } // Get target element
+
+ }, {
+ key: "target",
+ get: function get() {
+ return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
+ }
+ }], [{
+ key: "native",
+ get: function get() {
+ return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
+ } // Get the prefix for handlers
+
+ }, {
+ key: "prefix",
+ get: function get() {
+ // No prefix
+ if (is$1.function(document.exitFullscreen)) {
+ return '';
+ } // Check for fullscreen support by vendor prefix
+
+
+ var value = '';
+ var prefixes = ['webkit', 'moz', 'ms'];
+ prefixes.some(function (pre) {
+ if (is$1.function(document["".concat(pre, "ExitFullscreen")]) || is$1.function(document["".concat(pre, "CancelFullScreen")])) {
+ value = pre;
+ return true;
+ }
+
+ return false;
+ });
+ return value;
+ }
+ }, {
+ key: "property",
+ get: function get() {
+ return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
+ }
+ }]);
+
+ return Fullscreen;
+ }();
+
+ // 20.2.2.28 Math.sign(x)
+ var _mathSign = Math.sign || function sign(x) {
+ // eslint-disable-next-line no-self-compare
+ return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
+ };
+
+ // 20.2.2.28 Math.sign(x)
+
+
+ _export(_export.S, 'Math', { sign: _mathSign });
+
+ // ==========================================================================
+ // Load image avoiding xhr/fetch CORS issues
+ // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
+ // By default it checks if it is at least 1px, but you can add a second argument to change this
+ // ==========================================================================
+ function loadImage(src) {
+ var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
+ return new Promise(function (resolve, reject) {
+ var image = new Image();
+
+ var handler = function handler() {
+ delete image.onload;
+ delete image.onerror;
+ (image.naturalWidth >= minWidth ? resolve : reject)(image);
+ };
+
+ Object.assign(image, {
+ onload: handler,
+ onerror: handler,
+ src: src
+ });
+ });
+ }
+
+ var ui = {
+ addStyleHook: function addStyleHook() {
+ toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
+ toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
+ },
+ // Toggle native HTML5 media controls
+ toggleNativeControls: function toggleNativeControls() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- _export(_export.S, 'Math', {
- tanh: function tanh(x) {
- var a = _mathExpm1(x = +x);
- var b = _mathExpm1(-x);
- return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp$2(x) + exp$2(-x));
- }
- });
+ if (toggle && this.isHTML5) {
+ this.media.setAttribute('controls', '');
+ } else {
+ this.media.removeAttribute('controls');
+ }
+ },
+ // Setup the UI
+ build: function build() {
+ var _this = this;
- // 20.2.2.34 Math.trunc(x)
+ // Re-attach media element listeners
+ // TODO: Use event bubbling?
+ this.listeners.media(); // Don't setup interface if no support
+ if (!this.supported.ui) {
+ this.debug.warn("Basic support only for ".concat(this.provider, " ").concat(this.type)); // Restore native controls
- _export(_export.S, 'Math', {
- trunc: function trunc(it) {
- return (it > 0 ? Math.floor : Math.ceil)(it);
- }
- });
+ ui.toggleNativeControls.call(this, true); // Bail
- // https://github.com/tc39/Array.prototype.includes
+ return;
+ } // Inject custom controls if not present
- var $includes = _arrayIncludes(true);
- _export(_export.P, 'Array', {
- includes: function includes(el /* , fromIndex = 0 */) {
- return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
- }
- });
+ if (!is$1.element(this.elements.controls)) {
+ // Inject custom controls
+ controls.inject.call(this); // Re-attach control listeners
- _addToUnscopables('includes');
+ this.listeners.controls();
+ } // Remove native controls
- var isEnum$1 = _objectPie.f;
- var _objectToArray = function (isEntries) {
- return function (it) {
- var O = _toIobject(it);
- var keys = _objectKeys(O);
- var length = keys.length;
- var i = 0;
- var result = [];
- var key;
- while (length > i) if (isEnum$1.call(O, key = keys[i++])) {
- result.push(isEntries ? [key, O[key]] : O[key]);
- } return result;
- };
- };
- // https://github.com/tc39/proposal-object-values-entries
+ ui.toggleNativeControls.call(this); // Setup captions for HTML5
- var $values = _objectToArray(false);
+ if (this.isHTML5) {
+ captions.setup.call(this);
+ } // Reset volume
- _export(_export.S, 'Object', {
- values: function values(it) {
- return $values(it);
- }
- });
- // https://github.com/tc39/proposal-object-values-entries
+ this.volume = null; // Reset mute state
- var $entries = _objectToArray(true);
+ this.muted = null; // Reset speed
- _export(_export.S, 'Object', {
- entries: function entries(it) {
- return $entries(it);
- }
- });
+ this.speed = null; // Reset loop state
- // https://github.com/tc39/proposal-object-getownpropertydescriptors
+ this.loop = null; // Reset quality setting
+ this.quality = null; // Reset volume display
+ controls.updateVolume.call(this); // Reset time display
+ controls.timeUpdate.call(this); // Update the UI
+ ui.checkPlaying.call(this); // Check for picture-in-picture support
+ toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support
- _export(_export.S, 'Object', {
- getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
- var O = _toIobject(object);
- var getDesc = _objectGopd.f;
- var keys = _ownKeys(O);
- var result = {};
- var i = 0;
- var key, desc;
- while (keys.length > i) {
- desc = getDesc(O, key = keys[i++]);
- if (desc !== undefined) _createProperty(result, key, desc);
- }
- return result;
- }
- });
-
- // https://github.com/tc39/proposal-string-pad-start-end
-
-
-
-
- var _stringPad = function (that, maxLength, fillString, left) {
- var S = String(_defined(that));
- var stringLength = S.length;
- var fillStr = fillString === undefined ? ' ' : String(fillString);
- var intMaxLength = _toLength(maxLength);
- if (intMaxLength <= stringLength || fillStr == '') return S;
- var fillLen = intMaxLength - stringLength;
- var stringFiller = _stringRepeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
- if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
- return left ? stringFiller + S : S + stringFiller;
- };
-
- // https://github.com/tc39/proposal-string-pad-start-end
-
-
-
-
- // https://github.com/zloirock/core-js/issues/280
- _export(_export.P + _export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(_userAgent), 'String', {
- padStart: function padStart(maxLength /* , fillString = ' ' */) {
- return _stringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
- }
- });
-
- // https://github.com/tc39/proposal-string-pad-start-end
-
-
-
-
- // https://github.com/zloirock/core-js/issues/280
- _export(_export.P + _export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(_userAgent), 'String', {
- padEnd: function padEnd(maxLength /* , fillString = ' ' */) {
- return _stringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
- }
- });
-
- // ie9- setTimeout & setInterval additional parameters fix
-
-
-
- var slice = [].slice;
- var MSIE = /MSIE .\./.test(_userAgent); // <- dirty ie9- check
- var wrap$1 = function (set) {
- return function (fn, time /* , ...args */) {
- var boundArgs = arguments.length > 2;
- var args = boundArgs ? slice.call(arguments, 2) : false;
- return set(boundArgs ? function () {
- // eslint-disable-next-line no-new-func
- (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);
- } : fn, time);
- };
- };
- _export(_export.G + _export.B + _export.F * MSIE, {
- setTimeout: wrap$1(_global.setTimeout),
- setInterval: wrap$1(_global.setInterval)
- });
-
- _export(_export.G + _export.B, {
- setImmediate: _task.set,
- clearImmediate: _task.clear
- });
-
- var ITERATOR$4 = _wks('iterator');
- var TO_STRING_TAG = _wks('toStringTag');
- var ArrayValues = _iterators.Array;
-
- var DOMIterables = {
- CSSRuleList: true, // TODO: Not spec compliant, should be false.
- CSSStyleDeclaration: false,
- CSSValueList: false,
- ClientRectList: false,
- DOMRectList: false,
- DOMStringList: false,
- DOMTokenList: true,
- DataTransferItemList: false,
- FileList: false,
- HTMLAllCollection: false,
- HTMLCollection: false,
- HTMLFormElement: false,
- HTMLSelectElement: false,
- MediaList: true, // TODO: Not spec compliant, should be false.
- MimeTypeArray: false,
- NamedNodeMap: false,
- NodeList: true,
- PaintRequestList: false,
- Plugin: false,
- PluginArray: false,
- SVGLengthList: false,
- SVGNumberList: false,
- SVGPathSegList: false,
- SVGPointList: false,
- SVGStringList: false,
- SVGTransformList: false,
- SourceBufferList: false,
- StyleSheetList: true, // TODO: Not spec compliant, should be false.
- TextTrackCueList: false,
- TextTrackList: false,
- TouchList: false
- };
-
- for (var collections = _objectKeys(DOMIterables), i$1 = 0; i$1 < collections.length; i$1++) {
- var NAME$1 = collections[i$1];
- var explicit = DOMIterables[NAME$1];
- var Collection = _global[NAME$1];
- var proto = Collection && Collection.prototype;
- var key;
- if (proto) {
- if (!proto[ITERATOR$4]) _hide(proto, ITERATOR$4, ArrayValues);
- if (!proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME$1);
- _iterators[NAME$1] = ArrayValues;
- if (explicit) for (key in es6_array_iterator) if (!proto[key]) _redefine(proto, key, es6_array_iterator[key], true);
- }
- }
-
- var runtime = createCommonjsModule(function (module) {
- /**
- * Copyright (c) 2014, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
- * additional grant of patent rights can be found in the PATENTS file in
- * the same directory.
- */
-
- !(function(global) {
-
- var Op = Object.prototype;
- var hasOwn = Op.hasOwnProperty;
- var undefined; // More compressible than void 0.
- var $Symbol = typeof Symbol === "function" ? Symbol : {};
- var iteratorSymbol = $Symbol.iterator || "@@iterator";
- var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
- var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
- var runtime = global.regeneratorRuntime;
- if (runtime) {
- {
- // If regeneratorRuntime is defined globally and we're in a module,
- // make the exports object identical to regeneratorRuntime.
- module.exports = runtime;
- }
- // Don't bother evaluating the rest of this file if the runtime was
- // already defined globally.
- return;
- }
-
- // Define the runtime globally (as expected by generated code) as either
- // module.exports (if we're in a module) or a new, empty object.
- runtime = global.regeneratorRuntime = module.exports;
-
- function wrap(innerFn, outerFn, self, tryLocsList) {
- // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
- var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
- var generator = Object.create(protoGenerator.prototype);
- var context = new Context(tryLocsList || []);
-
- // The ._invoke method unifies the implementations of the .next,
- // .throw, and .return methods.
- generator._invoke = makeInvokeMethod(innerFn, self, context);
-
- return generator;
- }
- runtime.wrap = wrap;
-
- // Try/catch helper to minimize deoptimizations. Returns a completion
- // record like context.tryEntries[i].completion. This interface could
- // have been (and was previously) designed to take a closure to be
- // invoked without arguments, but in all the cases we care about we
- // already have an existing method we want to call, so there's no need
- // to create a new function object. We can even get away with assuming
- // the method takes exactly one argument, since that happens to be true
- // in every case, so we don't have to touch the arguments object. The
- // only additional allocation required is the completion record, which
- // has a stable shape and so hopefully should be cheap to allocate.
- function tryCatch(fn, obj, arg) {
- try {
- return { type: "normal", arg: fn.call(obj, arg) };
- } catch (err) {
- return { type: "throw", arg: err };
- }
- }
-
- var GenStateSuspendedStart = "suspendedStart";
- var GenStateSuspendedYield = "suspendedYield";
- var GenStateExecuting = "executing";
- var GenStateCompleted = "completed";
-
- // Returning this object from the innerFn has the same effect as
- // breaking out of the dispatch switch statement.
- var ContinueSentinel = {};
-
- // Dummy constructor functions that we use as the .constructor and
- // .constructor.prototype properties for functions that return Generator
- // objects. For full spec compliance, you may wish to configure your
- // minifier not to mangle the names of these two functions.
- function Generator() {}
- function GeneratorFunction() {}
- function GeneratorFunctionPrototype() {}
-
- // This is a polyfill for %IteratorPrototype% for environments that
- // don't natively support it.
- var IteratorPrototype = {};
- IteratorPrototype[iteratorSymbol] = function () {
- return this;
- };
-
- var getProto = Object.getPrototypeOf;
- var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
- if (NativeIteratorPrototype &&
- NativeIteratorPrototype !== Op &&
- hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
- // This environment has a native %IteratorPrototype%; use it instead
- // of the polyfill.
- IteratorPrototype = NativeIteratorPrototype;
- }
-
- var Gp = GeneratorFunctionPrototype.prototype =
- Generator.prototype = Object.create(IteratorPrototype);
- GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
- GeneratorFunctionPrototype.constructor = GeneratorFunction;
- GeneratorFunctionPrototype[toStringTagSymbol] =
- GeneratorFunction.displayName = "GeneratorFunction";
-
- // Helper for defining the .next, .throw, and .return methods of the
- // Iterator interface in terms of a single ._invoke method.
- function defineIteratorMethods(prototype) {
- ["next", "throw", "return"].forEach(function(method) {
- prototype[method] = function(arg) {
- return this._invoke(method, arg);
- };
- });
- }
-
- runtime.isGeneratorFunction = function(genFun) {
- var ctor = typeof genFun === "function" && genFun.constructor;
- return ctor
- ? ctor === GeneratorFunction ||
- // For the native GeneratorFunction constructor, the best we can
- // do is to check its .name property.
- (ctor.displayName || ctor.name) === "GeneratorFunction"
- : false;
- };
-
- runtime.mark = function(genFun) {
- if (Object.setPrototypeOf) {
- Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
- } else {
- genFun.__proto__ = GeneratorFunctionPrototype;
- if (!(toStringTagSymbol in genFun)) {
- genFun[toStringTagSymbol] = "GeneratorFunction";
- }
- }
- genFun.prototype = Object.create(Gp);
- return genFun;
- };
-
- // Within the body of any async function, `await x` is transformed to
- // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
- // `hasOwn.call(value, "__await")` to determine if the yielded value is
- // meant to be awaited.
- runtime.awrap = function(arg) {
- return { __await: arg };
- };
-
- function AsyncIterator(generator) {
- function invoke(method, arg, resolve, reject) {
- var record = tryCatch(generator[method], generator, arg);
- if (record.type === "throw") {
- reject(record.arg);
- } else {
- var result = record.arg;
- var value = result.value;
- if (value &&
- typeof value === "object" &&
- hasOwn.call(value, "__await")) {
- return Promise.resolve(value.__await).then(function(value) {
- invoke("next", value, resolve, reject);
- }, function(err) {
- invoke("throw", err, resolve, reject);
- });
- }
-
- return Promise.resolve(value).then(function(unwrapped) {
- // When a yielded Promise is resolved, its final value becomes
- // the .value of the Promise<{value,done}> result for the
- // current iteration. If the Promise is rejected, however, the
- // result for this iteration will be rejected with the same
- // reason. Note that rejections of yielded Promises are not
- // thrown back into the generator function, as is the case
- // when an awaited Promise is rejected. This difference in
- // behavior between yield and await is important, because it
- // allows the consumer to decide what to do with the yielded
- // rejection (swallow it and continue, manually .throw it back
- // into the generator, abandon iteration, whatever). With
- // await, by contrast, there is no opportunity to examine the
- // rejection reason outside the generator function, so the
- // only option is to throw it from the await expression, and
- // let the generator function handle the exception.
- result.value = unwrapped;
- resolve(result);
- }, reject);
- }
- }
-
- if (typeof global.process === "object" && global.process.domain) {
- invoke = global.process.domain.bind(invoke);
- }
-
- var previousPromise;
-
- function enqueue(method, arg) {
- function callInvokeWithMethodAndArg() {
- return new Promise(function(resolve, reject) {
- invoke(method, arg, resolve, reject);
- });
- }
-
- return previousPromise =
- // If enqueue has been called before, then we want to wait until
- // all previous Promises have been resolved before calling invoke,
- // so that results are always delivered in the correct order. If
- // enqueue has not been called before, then it is important to
- // call invoke immediately, without waiting on a callback to fire,
- // so that the async generator function has the opportunity to do
- // any necessary setup in a predictable way. This predictability
- // is why the Promise constructor synchronously invokes its
- // executor callback, and why async functions synchronously
- // execute code before the first await. Since we implement simple
- // async functions in terms of async generators, it is especially
- // important to get this right, even though it requires care.
- previousPromise ? previousPromise.then(
- callInvokeWithMethodAndArg,
- // Avoid propagating failures to Promises returned by later
- // invocations of the iterator.
- callInvokeWithMethodAndArg
- ) : callInvokeWithMethodAndArg();
- }
-
- // Define the unified helper method that is used to implement .next,
- // .throw, and .return (see defineIteratorMethods).
- this._invoke = enqueue;
- }
-
- defineIteratorMethods(AsyncIterator.prototype);
- AsyncIterator.prototype[asyncIteratorSymbol] = function () {
- return this;
- };
- runtime.AsyncIterator = AsyncIterator;
-
- // Note that simple async functions are implemented on top of
- // AsyncIterator objects; they just return a Promise for the value of
- // the final result produced by the iterator.
- runtime.async = function(innerFn, outerFn, self, tryLocsList) {
- var iter = new AsyncIterator(
- wrap(innerFn, outerFn, self, tryLocsList)
- );
-
- return runtime.isGeneratorFunction(outerFn)
- ? iter // If outerFn is a generator, return the full iterator.
- : iter.next().then(function(result) {
- return result.done ? result.value : iter.next();
- });
- };
-
- function makeInvokeMethod(innerFn, self, context) {
- var state = GenStateSuspendedStart;
-
- return function invoke(method, arg) {
- if (state === GenStateExecuting) {
- throw new Error("Generator is already running");
- }
-
- if (state === GenStateCompleted) {
- if (method === "throw") {
- throw arg;
- }
-
- // Be forgiving, per 25.3.3.3.3 of the spec:
- // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
- return doneResult();
- }
-
- context.method = method;
- context.arg = arg;
-
- while (true) {
- var delegate = context.delegate;
- if (delegate) {
- var delegateResult = maybeInvokeDelegate(delegate, context);
- if (delegateResult) {
- if (delegateResult === ContinueSentinel) continue;
- return delegateResult;
- }
- }
-
- if (context.method === "next") {
- // Setting context._sent for legacy support of Babel's
- // function.sent implementation.
- context.sent = context._sent = context.arg;
-
- } else if (context.method === "throw") {
- if (state === GenStateSuspendedStart) {
- state = GenStateCompleted;
- throw context.arg;
- }
-
- context.dispatchException(context.arg);
-
- } else if (context.method === "return") {
- context.abrupt("return", context.arg);
- }
-
- state = GenStateExecuting;
-
- var record = tryCatch(innerFn, self, context);
- if (record.type === "normal") {
- // If an exception is thrown from innerFn, we leave state ===
- // GenStateExecuting and loop back for another invocation.
- state = context.done
- ? GenStateCompleted
- : GenStateSuspendedYield;
-
- if (record.arg === ContinueSentinel) {
- continue;
- }
-
- return {
- value: record.arg,
- done: context.done
- };
-
- } else if (record.type === "throw") {
- state = GenStateCompleted;
- // Dispatch the exception by looping back around to the
- // context.dispatchException(context.arg) call above.
- context.method = "throw";
- context.arg = record.arg;
- }
- }
- };
- }
-
- // Call delegate.iterator[context.method](context.arg) and handle the
- // result, either by returning a { value, done } result from the
- // delegate iterator, or by modifying context.method and context.arg,
- // setting context.delegate to null, and returning the ContinueSentinel.
- function maybeInvokeDelegate(delegate, context) {
- var method = delegate.iterator[context.method];
- if (method === undefined) {
- // A .throw or .return when the delegate iterator has no .throw
- // method always terminates the yield* loop.
- context.delegate = null;
-
- if (context.method === "throw") {
- if (delegate.iterator.return) {
- // If the delegate iterator has a return method, give it a
- // chance to clean up.
- context.method = "return";
- context.arg = undefined;
- maybeInvokeDelegate(delegate, context);
-
- if (context.method === "throw") {
- // If maybeInvokeDelegate(context) changed context.method from
- // "return" to "throw", let that override the TypeError below.
- return ContinueSentinel;
- }
- }
-
- context.method = "throw";
- context.arg = new TypeError(
- "The iterator does not provide a 'throw' method");
- }
-
- return ContinueSentinel;
- }
-
- var record = tryCatch(method, delegate.iterator, context.arg);
-
- if (record.type === "throw") {
- context.method = "throw";
- context.arg = record.arg;
- context.delegate = null;
- return ContinueSentinel;
- }
-
- var info = record.arg;
-
- if (! info) {
- context.method = "throw";
- context.arg = new TypeError("iterator result is not an object");
- context.delegate = null;
- return ContinueSentinel;
- }
-
- if (info.done) {
- // Assign the result of the finished delegate to the temporary
- // variable specified by delegate.resultName (see delegateYield).
- context[delegate.resultName] = info.value;
-
- // Resume execution at the desired location (see delegateYield).
- context.next = delegate.nextLoc;
-
- // If context.method was "throw" but the delegate handled the
- // exception, let the outer generator proceed normally. If
- // context.method was "next", forget context.arg since it has been
- // "consumed" by the delegate iterator. If context.method was
- // "return", allow the original .return call to continue in the
- // outer generator.
- if (context.method !== "return") {
- context.method = "next";
- context.arg = undefined;
- }
-
- } else {
- // Re-yield the result returned by the delegate method.
- return info;
- }
-
- // The delegate iterator is finished, so forget it and continue with
- // the outer generator.
- context.delegate = null;
- return ContinueSentinel;
- }
-
- // Define Generator.prototype.{next,throw,return} in terms of the
- // unified ._invoke helper method.
- defineIteratorMethods(Gp);
-
- Gp[toStringTagSymbol] = "Generator";
-
- // A Generator should always return itself as the iterator object when the
- // @@iterator function is called on it. Some browsers' implementations of the
- // iterator prototype chain incorrectly implement this, causing the Generator
- // object to not be returned from this call. This ensures that doesn't happen.
- // See https://github.com/facebook/regenerator/issues/274 for more details.
- Gp[iteratorSymbol] = function() {
- return this;
- };
-
- Gp.toString = function() {
- return "[object Generator]";
- };
-
- function pushTryEntry(locs) {
- var entry = { tryLoc: locs[0] };
-
- if (1 in locs) {
- entry.catchLoc = locs[1];
- }
-
- if (2 in locs) {
- entry.finallyLoc = locs[2];
- entry.afterLoc = locs[3];
- }
-
- this.tryEntries.push(entry);
- }
-
- function resetTryEntry(entry) {
- var record = entry.completion || {};
- record.type = "normal";
- delete record.arg;
- entry.completion = record;
- }
-
- function Context(tryLocsList) {
- // The root entry object (effectively a try statement without a catch
- // or a finally block) gives us a place to store values thrown from
- // locations where there is no enclosing try statement.
- this.tryEntries = [{ tryLoc: "root" }];
- tryLocsList.forEach(pushTryEntry, this);
- this.reset(true);
- }
-
- runtime.keys = function(object) {
- var keys = [];
- for (var key in object) {
- keys.push(key);
- }
- keys.reverse();
-
- // Rather than returning an object with a next method, we keep
- // things simple and return the next function itself.
- return function next() {
- while (keys.length) {
- var key = keys.pop();
- if (key in object) {
- next.value = key;
- next.done = false;
- return next;
- }
- }
-
- // To avoid creating an additional object, we just hang the .value
- // and .done properties off the next function object itself. This
- // also ensures that the minifier will not anonymize the function.
- next.done = true;
- return next;
- };
- };
-
- function values(iterable) {
- if (iterable) {
- var iteratorMethod = iterable[iteratorSymbol];
- if (iteratorMethod) {
- return iteratorMethod.call(iterable);
- }
-
- if (typeof iterable.next === "function") {
- return iterable;
- }
-
- if (!isNaN(iterable.length)) {
- var i = -1, next = function next() {
- while (++i < iterable.length) {
- if (hasOwn.call(iterable, i)) {
- next.value = iterable[i];
- next.done = false;
- return next;
- }
- }
-
- next.value = undefined;
- next.done = true;
-
- return next;
- };
-
- return next.next = next;
- }
- }
-
- // Return an iterator with no values.
- return { next: doneResult };
- }
- runtime.values = values;
-
- function doneResult() {
- return { value: undefined, done: true };
- }
-
- Context.prototype = {
- constructor: Context,
-
- reset: function(skipTempReset) {
- this.prev = 0;
- this.next = 0;
- // Resetting context._sent for legacy support of Babel's
- // function.sent implementation.
- this.sent = this._sent = undefined;
- this.done = false;
- this.delegate = null;
-
- this.method = "next";
- this.arg = undefined;
-
- this.tryEntries.forEach(resetTryEntry);
-
- if (!skipTempReset) {
- for (var name in this) {
- // Not sure about the optimal order of these conditions:
- if (name.charAt(0) === "t" &&
- hasOwn.call(this, name) &&
- !isNaN(+name.slice(1))) {
- this[name] = undefined;
- }
- }
- }
- },
-
- stop: function() {
- this.done = true;
-
- var rootEntry = this.tryEntries[0];
- var rootRecord = rootEntry.completion;
- if (rootRecord.type === "throw") {
- throw rootRecord.arg;
- }
-
- return this.rval;
- },
-
- dispatchException: function(exception) {
- if (this.done) {
- throw exception;
- }
-
- var context = this;
- function handle(loc, caught) {
- record.type = "throw";
- record.arg = exception;
- context.next = loc;
-
- if (caught) {
- // If the dispatched exception was caught by a catch block,
- // then let that catch block handle the exception normally.
- context.method = "next";
- context.arg = undefined;
- }
-
- return !! caught;
- }
-
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- var record = entry.completion;
-
- if (entry.tryLoc === "root") {
- // Exception thrown outside of any try block that could handle
- // it, so set the completion value of the entire function to
- // throw the exception.
- return handle("end");
- }
-
- if (entry.tryLoc <= this.prev) {
- var hasCatch = hasOwn.call(entry, "catchLoc");
- var hasFinally = hasOwn.call(entry, "finallyLoc");
-
- if (hasCatch && hasFinally) {
- if (this.prev < entry.catchLoc) {
- return handle(entry.catchLoc, true);
- } else if (this.prev < entry.finallyLoc) {
- return handle(entry.finallyLoc);
- }
-
- } else if (hasCatch) {
- if (this.prev < entry.catchLoc) {
- return handle(entry.catchLoc, true);
- }
-
- } else if (hasFinally) {
- if (this.prev < entry.finallyLoc) {
- return handle(entry.finallyLoc);
- }
-
- } else {
- throw new Error("try statement without catch or finally");
- }
- }
- }
- },
-
- abrupt: function(type, arg) {
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- if (entry.tryLoc <= this.prev &&
- hasOwn.call(entry, "finallyLoc") &&
- this.prev < entry.finallyLoc) {
- var finallyEntry = entry;
- break;
- }
- }
-
- if (finallyEntry &&
- (type === "break" ||
- type === "continue") &&
- finallyEntry.tryLoc <= arg &&
- arg <= finallyEntry.finallyLoc) {
- // Ignore the finally entry if control is not jumping to a
- // location outside the try/catch block.
- finallyEntry = null;
- }
-
- var record = finallyEntry ? finallyEntry.completion : {};
- record.type = type;
- record.arg = arg;
-
- if (finallyEntry) {
- this.method = "next";
- this.next = finallyEntry.finallyLoc;
- return ContinueSentinel;
- }
-
- return this.complete(record);
- },
-
- complete: function(record, afterLoc) {
- if (record.type === "throw") {
- throw record.arg;
- }
-
- if (record.type === "break" ||
- record.type === "continue") {
- this.next = record.arg;
- } else if (record.type === "return") {
- this.rval = this.arg = record.arg;
- this.method = "return";
- this.next = "end";
- } else if (record.type === "normal" && afterLoc) {
- this.next = afterLoc;
- }
-
- return ContinueSentinel;
- },
-
- finish: function(finallyLoc) {
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- if (entry.finallyLoc === finallyLoc) {
- this.complete(entry.completion, entry.afterLoc);
- resetTryEntry(entry);
- return ContinueSentinel;
- }
- }
- },
-
- "catch": function(tryLoc) {
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- if (entry.tryLoc === tryLoc) {
- var record = entry.completion;
- if (record.type === "throw") {
- var thrown = record.arg;
- resetTryEntry(entry);
- }
- return thrown;
- }
- }
-
- // The context.catch method must only be called with a location
- // argument that corresponds to a known catch block.
- throw new Error("illegal catch attempt");
- },
-
- delegateYield: function(iterable, resultName, nextLoc) {
- this.delegate = {
- iterator: values(iterable),
- resultName: resultName,
- nextLoc: nextLoc
- };
-
- if (this.method === "next") {
- // Deliberately forget the last sent value so that we don't
- // accidentally pass it on to the delegate.
- this.arg = undefined;
- }
-
- return ContinueSentinel;
- }
- };
- })(
- // Among the various tricks for obtaining a reference to the global
- // object, this seems to be the most reliable technique that does not
- // use indirect eval (which violates Content Security Policy).
- typeof commonjsGlobal === "object" ? commonjsGlobal :
- typeof window === "object" ? window :
- typeof self === "object" ? self : commonjsGlobal
- );
- });
-
- // Polyfill for creating CustomEvents on IE9/10/11
-
- // code pulled from:
- // https://github.com/d4tocchini/customevent-polyfill
- // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill
-
- (function() {
- if (typeof window === 'undefined') {
- return;
- }
-
- try {
- var ce = new window.CustomEvent('test', { cancelable: true });
- ce.preventDefault();
- if (ce.defaultPrevented !== true) {
- // IE has problems with .preventDefault() on custom events
- // http://stackoverflow.com/questions/23349191
- throw new Error('Could not prevent default');
- }
- } catch (e) {
- var CustomEvent = function(event, params) {
- var evt, origPrevent;
- params = params || {
- bubbles: false,
- cancelable: false,
- detail: undefined
- };
-
- evt = document.createEvent('CustomEvent');
- evt.initCustomEvent(
- event,
- params.bubbles,
- params.cancelable,
- params.detail
- );
- origPrevent = evt.preventDefault;
- evt.preventDefault = function() {
- origPrevent.call(this);
- try {
- Object.defineProperty(this, 'defaultPrevented', {
- get: function() {
- return true;
- }
- });
- } catch (e) {
- this.defaultPrevented = true;
- }
- };
- return evt;
- };
-
- CustomEvent.prototype = window.Event.prototype;
- window.CustomEvent = CustomEvent; // expose definition to window
- }
- })();
-
- (function(global) {
- /**
- * Polyfill URLSearchParams
- *
- * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js
- */
-
- var checkIfIteratorIsSupported = function() {
- try {
- return !!Symbol.iterator;
- } catch(error) {
- return false;
- }
- };
-
-
- var iteratorSupported = checkIfIteratorIsSupported();
-
- var createIterator = function(items) {
- var iterator = {
- next: function() {
- var value = items.shift();
- return { done: value === void 0, value: value };
- }
- };
-
- if(iteratorSupported) {
- iterator[Symbol.iterator] = function() {
- return iterator;
- };
- }
-
- return iterator;
- };
-
- /**
- * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing
- * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.
- */
- var serializeParam = function(value) {
- return encodeURIComponent(value).replace(/%20/g, '+');
- };
-
- var deserializeParam = function(value) {
- return decodeURIComponent(value).replace(/\+/g, ' ');
- };
-
- var polyfillURLSearchParams= function() {
-
- var URLSearchParams = function(searchString) {
- Object.defineProperty(this, '_entries', { value: {} });
-
- if(typeof searchString === 'string') {
- if(searchString !== '') {
- searchString = searchString.replace(/^\?/, '');
- var attributes = searchString.split('&');
- var attribute;
- for(var i = 0; i < attributes.length; i++) {
- attribute = attributes[i].split('=');
- this.append(
- deserializeParam(attribute[0]),
- (attribute.length > 1) ? deserializeParam(attribute[1]) : ''
- );
- }
- }
- } else if(searchString instanceof URLSearchParams) {
- var _this = this;
- searchString.forEach(function(value, name) {
- _this.append(value, name);
- });
- }
- };
-
- var proto = URLSearchParams.prototype;
-
- proto.append = function(name, value) {
- if(name in this._entries) {
- this._entries[name].push(value.toString());
- } else {
- this._entries[name] = [value.toString()];
- }
- };
-
- proto.delete = function(name) {
- delete this._entries[name];
- };
-
- proto.get = function(name) {
- return (name in this._entries) ? this._entries[name][0] : null;
- };
-
- proto.getAll = function(name) {
- return (name in this._entries) ? this._entries[name].slice(0) : [];
- };
-
- proto.has = function(name) {
- return (name in this._entries);
- };
-
- proto.set = function(name, value) {
- this._entries[name] = [value.toString()];
- };
-
- proto.forEach = function(callback, thisArg) {
- var entries;
- for(var name in this._entries) {
- if(this._entries.hasOwnProperty(name)) {
- entries = this._entries[name];
- for(var i = 0; i < entries.length; i++) {
- callback.call(thisArg, entries[i], name, this);
- }
- }
- }
- };
-
- proto.keys = function() {
- var items = [];
- this.forEach(function(value, name) { items.push(name); });
- return createIterator(items);
- };
-
- proto.values = function() {
- var items = [];
- this.forEach(function(value) { items.push(value); });
- return createIterator(items);
- };
-
- proto.entries = function() {
- var items = [];
- this.forEach(function(value, name) { items.push([name, value]); });
- return createIterator(items);
- };
-
- if(iteratorSupported) {
- proto[Symbol.iterator] = proto.entries;
- }
-
- proto.toString = function() {
- var searchArray = [];
- this.forEach(function(value, name) {
- searchArray.push(serializeParam(name) + '=' + serializeParam(value));
- });
- return searchArray.join("&");
- };
-
- global.URLSearchParams = URLSearchParams;
- };
-
- if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {
- polyfillURLSearchParams();
- }
-
- // HTMLAnchorElement
-
- })(
- (typeof commonjsGlobal !== 'undefined') ? commonjsGlobal
- : ((typeof window !== 'undefined') ? window
- : ((typeof self !== 'undefined') ? self : commonjsGlobal))
- );
-
- (function(global) {
- /**
- * Polyfill URL
- *
- * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js
- */
-
- var checkIfURLIsSupported = function() {
- try {
- var u = new URL('b', 'http://a');
- u.pathname = 'c%20d';
- return (u.href === 'http://a/c%20d') && u.searchParams;
- } catch(e) {
- return false;
- }
- };
-
-
- var polyfillURL = function() {
- var _URL = global.URL;
-
- var URL = function(url, base) {
- if(typeof url !== 'string') url = String(url);
-
- // Only create another document if the base is different from current location.
- var doc = document, baseElement;
- if(base && (global.location === void 0 || base !== global.location.href)) {
- doc = document.implementation.createHTMLDocument('');
- baseElement = doc.createElement('base');
- baseElement.href = base;
- doc.head.appendChild(baseElement);
- try {
- if(baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);
- } catch (err) {
- throw new Error("URL unable to set base " + base + " due to " + err);
- }
- }
-
- var anchorElement = doc.createElement('a');
- anchorElement.href = url;
- if (baseElement) {
- doc.body.appendChild(anchorElement);
- anchorElement.href = anchorElement.href; // force href to refresh
- }
-
- if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {
- throw new TypeError('Invalid URL');
- }
-
- Object.defineProperty(this, '_anchorElement', {
- value: anchorElement
- });
- };
-
- var proto = URL.prototype;
-
- var linkURLWithAnchorAttribute = function(attributeName) {
- Object.defineProperty(proto, attributeName, {
- get: function() {
- return this._anchorElement[attributeName];
- },
- set: function(value) {
- this._anchorElement[attributeName] = value;
- },
- enumerable: true
- });
- };
-
- ['hash', 'host', 'hostname', 'port', 'protocol', 'search']
- .forEach(function(attributeName) {
- linkURLWithAnchorAttribute(attributeName);
- });
-
- Object.defineProperties(proto, {
-
- 'toString': {
- get: function() {
- var _this = this;
- return function() {
- return _this.href;
- };
- }
- },
-
- 'href' : {
- get: function() {
- return this._anchorElement.href.replace(/\?$/,'');
- },
- set: function(value) {
- this._anchorElement.href = value;
- },
- enumerable: true
- },
-
- 'pathname' : {
- get: function() {
- return this._anchorElement.pathname.replace(/(^\/?)/,'/');
- },
- set: function(value) {
- this._anchorElement.pathname = value;
- },
- enumerable: true
- },
-
- 'origin': {
- get: function() {
- // get expected port from protocol
- var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];
- // add port to origin if, expected port is different than actual port
- // and it is not empty f.e http://foo:8080
- // 8080 != 80 && 8080 != ''
- var addPortToOrigin = this._anchorElement.port != expectedPort &&
- this._anchorElement.port !== '';
-
- return this._anchorElement.protocol +
- '//' +
- this._anchorElement.hostname +
- (addPortToOrigin ? (':' + this._anchorElement.port) : '');
- },
- enumerable: true
- },
-
- 'password': { // TODO
- get: function() {
- return '';
- },
- set: function(value) {
- },
- enumerable: true
- },
-
- 'username': { // TODO
- get: function() {
- return '';
- },
- set: function(value) {
- },
- enumerable: true
- },
-
- 'searchParams': {
- get: function() {
- var searchParams = new URLSearchParams(this.search);
- var _this = this;
- ['append', 'delete', 'set'].forEach(function(methodName) {
- var method = searchParams[methodName];
- searchParams[methodName] = function() {
- method.apply(searchParams, arguments);
- _this.search = searchParams.toString();
- };
- });
- return searchParams;
- },
- enumerable: true
- }
- });
-
- URL.createObjectURL = function(blob) {
- return _URL.createObjectURL.apply(_URL, arguments);
- };
-
- URL.revokeObjectURL = function(url) {
- return _URL.revokeObjectURL.apply(_URL, arguments);
- };
-
- global.URL = URL;
-
- };
-
- if(!checkIfURLIsSupported()) {
- polyfillURL();
- }
-
- if((global.location !== void 0) && !('origin' in global.location)) {
- var getOrigin = function() {
- return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');
- };
-
- try {
- Object.defineProperty(global.location, 'origin', {
- get: getOrigin,
- enumerable: true
- });
- } catch(e) {
- setInterval(function() {
- global.location.origin = getOrigin();
- }, 100);
- }
- }
-
- })(
- (typeof commonjsGlobal !== 'undefined') ? commonjsGlobal
- : ((typeof window !== 'undefined') ? window
- : ((typeof self !== 'undefined') ? self : commonjsGlobal))
- );
-
- // ==========================================================================
- // Type checking utils
- // ==========================================================================
-
- var getConstructor = function getConstructor(input) {
- return input !== null && typeof input !== 'undefined' ? input.constructor : null;
- };
- var instanceOf = function instanceOf(input, constructor) {
- return Boolean(input && constructor && input instanceof constructor);
- };
- var isNullOrUndefined = function isNullOrUndefined(input) {
- return input === null || typeof input === 'undefined';
- };
- var isObject = function isObject(input) {
- return getConstructor(input) === Object;
- };
- var isNumber = function isNumber(input) {
- return getConstructor(input) === Number && !Number.isNaN(input);
- };
- var isString = function isString(input) {
- return getConstructor(input) === String;
- };
- var isBoolean = function isBoolean(input) {
- return getConstructor(input) === Boolean;
- };
- var isFunction = function isFunction(input) {
- return getConstructor(input) === Function;
- };
- var isArray = function isArray(input) {
- return Array.isArray(input);
- };
- var isWeakMap = function isWeakMap(input) {
- return instanceOf(input, WeakMap);
- };
- var isNodeList = function isNodeList(input) {
- return instanceOf(input, NodeList);
- };
- var isElement = function isElement(input) {
- return instanceOf(input, Element);
- };
- var isTextNode = function isTextNode(input) {
- return getConstructor(input) === Text;
- };
- var isEvent = function isEvent(input) {
- return instanceOf(input, Event);
- };
- var isKeyboardEvent = function isKeyboardEvent(input) {
- return instanceOf(input, KeyboardEvent);
- };
- var isCue = function isCue(input) {
- return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);
- };
- var isTrack = function isTrack(input) {
- return instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);
- };
-
- var isEmpty = function isEmpty(input) {
- return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;
- };
-
- var isUrl = function isUrl(input) {
- // Accept a URL object
- if (instanceOf(input, window.URL)) {
- return true;
- }
-
- // Add the protocol if required
- var string = input;
- if (!input.startsWith('http://') || !input.startsWith('https://')) {
- string = 'http://' + input;
- }
-
- try {
- return !isEmpty(new URL(string).hostname);
- } catch (e) {
- return false;
- }
- };
-
- var is$1 = {
- nullOrUndefined: isNullOrUndefined,
- object: isObject,
- number: isNumber,
- string: isString,
- boolean: isBoolean,
- function: isFunction,
- array: isArray,
- weakMap: isWeakMap,
- nodeList: isNodeList,
- element: isElement,
- textNode: isTextNode,
- event: isEvent,
- keyboardEvent: isKeyboardEvent,
- cue: isCue,
- track: isTrack,
- url: isUrl,
- empty: isEmpty
- };
-
- // ==========================================================================
-
- // Check for passive event listener support
- // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
- // https://www.youtube.com/watch?v=NPM6172J22g
- var supportsPassiveListeners = function () {
- // Test via a getter in the options object to see if the passive property is accessed
- var supported = false;
- try {
- var options = Object.defineProperty({}, 'passive', {
- get: function get() {
- supported = true;
- return null;
- }
- });
- window.addEventListener('test', null, options);
- window.removeEventListener('test', null, options);
- } catch (e) {
- // Do nothing
- }
-
- return supported;
- }();
-
- // Toggle event listener
- function toggleListener(element, event, callback) {
- var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
-
- var _this = this;
-
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
-
- // Bail if no element, event, or callback
- if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {
- return;
- }
-
- // Allow multiple events
- var events = event.split(' ');
-
- // Build options
- // Default to just the capture boolean for browsers with no passive listener support
- var options = capture;
-
- // If passive events listeners are supported
- if (supportsPassiveListeners) {
- options = {
- // Whether the listener can be passive (i.e. default never prevented)
- passive: passive,
- // Whether the listener is a capturing listener or not
- capture: capture
- };
- }
-
- // If a single node is passed, bind the event listener
- events.forEach(function (type) {
- if (_this && _this.eventListeners && toggle) {
- // Cache event listener
- _this.eventListeners.push({ element: element, type: type, callback: callback, options: options });
- }
-
- element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
- });
- }
-
- // Bind event handler
- function on(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
-
- toggleListener.call(this, element, events, callback, true, passive, capture);
- }
-
- // Unbind event handler
- function off(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
-
- toggleListener.call(this, element, events, callback, false, passive, capture);
- }
-
- // Bind once-only event handler
- function once(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
-
- function onceCallback() {
- off(element, events, onceCallback, passive, capture);
-
- for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
-
- callback.apply(this, args);
- }
-
- toggleListener.call(this, element, events, onceCallback, true, passive, capture);
- }
-
- // Trigger event
- function triggerEvent(element) {
- var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
-
- // Bail if no element
- if (!is$1.element(element) || is$1.empty(type)) {
- return;
- }
-
- // Create and dispatch the event
- var event = new CustomEvent(type, {
- bubbles: bubbles,
- detail: Object.assign({}, detail, {
- plyr: this
- })
- });
-
- // Dispatch the event
- element.dispatchEvent(event);
- }
-
- // Unbind all cached event listeners
- function unbindListeners() {
- if (this && this.eventListeners) {
- this.eventListeners.forEach(function (item) {
- var element = item.element,
- type = item.type,
- callback = item.callback,
- options = item.options;
-
- element.removeEventListener(type, callback, options);
- });
-
- this.eventListeners = [];
- }
- }
-
- // Run method when / if player is ready
- function ready() {
- var _this2 = this;
-
- return new Promise(function (resolve) {
- return _this2.ready ? setTimeout(resolve, 0) : on.call(_this2, _this2.elements.container, 'ready', resolve);
- }).then(function () {});
- }
-
- var classCallCheck = function (instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- };
-
- var createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
-
- return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);
- if (staticProps) defineProperties(Constructor, staticProps);
- return Constructor;
- };
- }();
-
- var defineProperty$1 = function (obj, key, value) {
- if (key in obj) {
- Object.defineProperty(obj, key, {
- value: value,
- enumerable: true,
- configurable: true,
- writable: true
- });
- } else {
- obj[key] = value;
- }
-
- return obj;
- };
-
- var slicedToArray = function () {
- function sliceIterator(arr, i) {
- var _arr = [];
- var _n = true;
- var _d = false;
- var _e = undefined;
-
- try {
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
- _arr.push(_s.value);
-
- if (i && _arr.length === i) break;
- }
- } catch (err) {
- _d = true;
- _e = err;
- } finally {
- try {
- if (!_n && _i["return"]) _i["return"]();
- } finally {
- if (_d) throw _e;
- }
- }
-
- return _arr;
- }
-
- return function (arr, i) {
- if (Array.isArray(arr)) {
- return arr;
- } else if (Symbol.iterator in Object(arr)) {
- return sliceIterator(arr, i);
- } else {
- throw new TypeError("Invalid attempt to destructure non-iterable instance");
- }
- };
- }();
-
- var toConsumableArray = function (arr) {
- if (Array.isArray(arr)) {
- for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
-
- return arr2;
- } else {
- return Array.from(arr);
- }
- };
-
- // ==========================================================================
-
- // Wrap an element
- function wrap$2(elements, wrapper) {
- // Convert `elements` to an array, if necessary.
- var targets = elements.length ? elements : [elements];
-
- // Loops backwards to prevent having to clone the wrapper on the
- // first element (see `child` below).
- Array.from(targets).reverse().forEach(function (element, index) {
- var child = index > 0 ? wrapper.cloneNode(true) : wrapper;
-
- // Cache the current parent and sibling.
- var parent = element.parentNode;
- var sibling = element.nextSibling;
-
- // Wrap the element (is automatically removed from its current
- // parent).
- child.appendChild(element);
-
- // If the element had a sibling, insert the wrapper before
- // the sibling to maintain the HTML structure; otherwise, just
- // append it to the parent.
- if (sibling) {
- parent.insertBefore(child, sibling);
- } else {
- parent.appendChild(child);
- }
- });
- }
-
- // Set attributes
- function setAttributes(element, attributes) {
- if (!is$1.element(element) || is$1.empty(attributes)) {
- return;
- }
-
- // Assume null and undefined attributes should be left out,
- // Setting them would otherwise convert them to "null" and "undefined"
- Object.entries(attributes).filter(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- value = _ref2[1];
-
- return !is$1.nullOrUndefined(value);
- }).forEach(function (_ref3) {
- var _ref4 = slicedToArray(_ref3, 2),
- key = _ref4[0],
- value = _ref4[1];
-
- return element.setAttribute(key, value);
- });
- }
-
- // Create a DocumentFragment
- function createElement(type, attributes, text) {
- // Create a new <element>
- var element = document.createElement(type);
-
- // Set all passed attributes
- if (is$1.object(attributes)) {
- setAttributes(element, attributes);
- }
-
- // Add text node
- if (is$1.string(text)) {
- element.innerText = text;
- }
-
- // Return built element
- return element;
- }
-
- // Inaert an element after another
- function insertAfter(element, target) {
- if (!is$1.element(element) || !is$1.element(target)) {
- return;
- }
-
- target.parentNode.insertBefore(element, target.nextSibling);
- }
-
- // Insert a DocumentFragment
- function insertElement(type, parent, attributes, text) {
- if (!is$1.element(parent)) {
- return;
- }
-
- parent.appendChild(createElement(type, attributes, text));
- }
-
- // Remove element(s)
- function removeElement(element) {
- if (is$1.nodeList(element) || is$1.array(element)) {
- Array.from(element).forEach(removeElement);
- return;
- }
-
- if (!is$1.element(element) || !is$1.element(element.parentNode)) {
- return;
- }
-
- element.parentNode.removeChild(element);
- }
-
- // Remove all child elements
- function emptyElement(element) {
- if (!is$1.element(element)) {
- return;
- }
-
- var length = element.childNodes.length;
-
-
- while (length > 0) {
- element.removeChild(element.lastChild);
- length -= 1;
- }
- }
-
- // Replace element
- function replaceElement(newChild, oldChild) {
- if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {
- return null;
- }
-
- oldChild.parentNode.replaceChild(newChild, oldChild);
-
- return newChild;
- }
-
- // Get an attribute object from a string selector
- function getAttributesFromSelector(sel, existingAttributes) {
- // For example:
- // '.test' to { class: 'test' }
- // '#test' to { id: 'test' }
- // '[data-test="test"]' to { 'data-test': 'test' }
-
- if (!is$1.string(sel) || is$1.empty(sel)) {
- return {};
- }
-
- var attributes = {};
- var existing = existingAttributes;
-
- sel.split(',').forEach(function (s) {
- // Remove whitespace
- var selector = s.trim();
- var className = selector.replace('.', '');
- var stripped = selector.replace(/[[\]]/g, '');
-
- // Get the parts and value
- var parts = stripped.split('=');
- var key = parts[0];
- var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : '';
-
- // Get the first character
- var start = selector.charAt(0);
-
- switch (start) {
- case '.':
- // Add to existing classname
- if (is$1.object(existing) && is$1.string(existing.class)) {
- existing.class += ' ' + className;
- }
-
- attributes.class = className;
- break;
-
- case '#':
- // ID selector
- attributes.id = selector.replace('#', '');
- break;
-
- case '[':
- // Attribute selector
- attributes[key] = value;
-
- break;
-
- default:
- break;
- }
- });
-
- return attributes;
- }
-
- // Toggle hidden
- function toggleHidden(element, hidden) {
- if (!is$1.element(element)) {
- return;
- }
-
- var hide = hidden;
-
- if (!is$1.boolean(hide)) {
- hide = !element.hidden;
- }
-
- if (hide) {
- element.setAttribute('hidden', '');
- } else {
- element.removeAttribute('hidden');
- }
- }
-
- // Mirror Element.classList.toggle, with IE compatibility for "force" argument
- function toggleClass(element, className, force) {
- if (is$1.nodeList(element)) {
- return Array.from(element).map(function (e) {
- return toggleClass(e, className, force);
- });
- }
-
- if (is$1.element(element)) {
- var method = 'toggle';
- if (typeof force !== 'undefined') {
- method = force ? 'add' : 'remove';
- }
-
- element.classList[method](className);
- return element.classList.contains(className);
- }
-
- return false;
- }
-
- // Has class name
- function hasClass(element, className) {
- return is$1.element(element) && element.classList.contains(className);
- }
-
- // Element matches selector
- function matches(element, selector) {
- var prototype = { Element: Element };
-
- function match() {
- return Array.from(document.querySelectorAll(selector)).includes(this);
- }
-
- var matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
-
- return matches.call(element, selector);
- }
-
- // Find all elements
- function getElements(selector) {
- return this.elements.container.querySelectorAll(selector);
- }
-
- // Find a single element
- function getElement(selector) {
- return this.elements.container.querySelector(selector);
- }
-
- // Trap focus inside container
- function trapFocus() {
- var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- if (!is$1.element(element)) {
- return;
- }
-
- var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
- var first = focusable[0];
- var last = focusable[focusable.length - 1];
-
- var trap = function trap(event) {
- // Bail if not tab key or not fullscreen
- if (event.key !== 'Tab' || event.keyCode !== 9) {
- return;
- }
-
- // Get the current focused element
- var focused = document.activeElement;
-
- if (focused === last && !event.shiftKey) {
- // Move focus to first element that can be tabbed if Shift isn't used
- first.focus();
- event.preventDefault();
- } else if (focused === first && event.shiftKey) {
- // Move focus to last element that can be tabbed if Shift is used
- last.focus();
- event.preventDefault();
- }
- };
-
- toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
- }
-
- // Set focus and tab focus class
- function setFocus() {
- var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- if (!is$1.element(element)) {
- return;
- }
-
- // Set regular focus
- element.focus();
-
- // If we want to mimic keyboard focus via tab
- if (tabFocus) {
- toggleClass(element, this.config.classNames.tabFocus);
- }
- }
-
- // ==========================================================================
-
- var transitionEndEvent = function () {
- var element = document.createElement('span');
-
- var events = {
- WebkitTransition: 'webkitTransitionEnd',
- MozTransition: 'transitionend',
- OTransition: 'oTransitionEnd otransitionend',
- transition: 'transitionend'
- };
-
- var type = Object.keys(events).find(function (event) {
- return element.style[event] !== undefined;
- });
-
- return is$1.string(type) ? events[type] : false;
- }();
-
- // Force repaint of element
- function repaint(element) {
- setTimeout(function () {
- try {
- toggleHidden(element, true);
- element.offsetHeight; // eslint-disable-line
- toggleHidden(element, false);
- } catch (e) {
- // Do nothing
- }
- }, 0);
- }
-
- // ==========================================================================
- // Browser sniffing
- // Unfortunately, due to mixed support, UA sniffing is required
- // ==========================================================================
-
- var browser = {
- isIE: /* @cc_on!@ */!!document.documentMode,
- isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
- isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
- isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
- };
-
- // ==========================================================================
-
- // Default codecs for checking mimetype support
- var defaultCodecs = {
- 'audio/ogg': 'vorbis',
- 'audio/wav': '1',
- 'video/webm': 'vp8, vorbis',
- 'video/mp4': 'avc1.42E01E, mp4a.40.2',
- 'video/ogg': 'theora'
- };
-
- // Check for feature support
- var support = {
- // Basic support
- audio: 'canPlayType' in document.createElement('audio'),
- video: 'canPlayType' in document.createElement('video'),
-
- // Check for support
- // Basic functionality vs full UI
- check: function check(type, provider, playsinline) {
- var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
- var api = support[type] || provider !== 'html5';
- var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
-
- return {
- api: api,
- ui: ui
- };
- },
-
-
- // Picture-in-picture support
- // Safari only currently
- pip: function () {
- return !browser.isIPhone && is$1.function(createElement('video').webkitSetPresentationMode);
- }(),
-
- // Airplay support
- // Safari only currently
- airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),
-
- // Inline playback support
- // https://webkit.org/blog/6784/new-video-policies-for-ios/
- playsinline: 'playsInline' in document.createElement('video'),
-
- // Check for mime type support against a player instance
- // Credits: http://diveintohtml5.info/everything.html
- // Related: http://www.leanbackplayer.com/test/h5mt.html
- mime: function mime(inputType) {
- var _inputType$split = inputType.split('/'),
- _inputType$split2 = slicedToArray(_inputType$split, 1),
- mediaType = _inputType$split2[0];
-
- if (!this.isHTML5 || mediaType !== this.type) {
- return false;
- }
-
- var type = void 0;
- if (inputType && inputType.includes('codecs=')) {
- // Use input directly
- type = inputType;
- } else if (inputType === 'audio/mpeg') {
- // Skip codec
- type = 'audio/mpeg;';
- } else if (inputType in defaultCodecs) {
- // Use codec
- type = inputType + '; codecs="' + defaultCodecs[inputType] + '"';
- }
-
- try {
- return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
- } catch (err) {
- return false;
- }
- },
-
-
- // Check for textTracks support
- textTracks: 'textTracks' in document.createElement('video'),
-
- // <input type="range"> Sliders
- rangeInput: function () {
- var range = document.createElement('input');
- range.type = 'range';
- return range.type === 'range';
- }(),
-
- // Touch
- // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
- touch: 'ontouchstart' in document.documentElement,
-
- // Detect transitions support
- transitions: transitionEndEvent !== false,
-
- // Reduced motion iOS & MacOS setting
- // https://webkit.org/blog/7551/responsive-design-for-motion/
- reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
- };
-
- // ==========================================================================
-
- var html5 = {
- getSources: function getSources() {
- var _this = this;
-
- if (!this.isHTML5) {
- return [];
- }
-
- var sources = Array.from(this.media.querySelectorAll('source'));
-
- // Filter out unsupported sources
- return sources.filter(function (source) {
- return support.mime.call(_this, source.getAttribute('type'));
- });
- },
-
-
- // Get quality levels
- getQualityOptions: function getQualityOptions() {
- // Get sizes from <source> elements
- return html5.getSources.call(this).map(function (source) {
- return Number(source.getAttribute('size'));
- }).filter(Boolean);
- },
- extend: function extend() {
- if (!this.isHTML5) {
- return;
- }
-
- var player = this;
-
- // Quality
- Object.defineProperty(player.media, 'quality', {
- get: function get() {
- // Get sources
- var sources = html5.getSources.call(player);
- var source = sources.find(function (source) {
- return source.getAttribute('src') === player.source;
- });
-
- // Return size, if match is found
- return source && Number(source.getAttribute('size'));
- },
- set: function set(input) {
- // Get sources
- var sources = html5.getSources.call(player);
-
- // Get first match for requested size
- var source = sources.find(function (source) {
- return Number(source.getAttribute('size')) === input;
- });
-
- // No matching source found
- if (!source) {
- return;
- }
-
- // Get current state
- var _player$media = player.media,
- currentTime = _player$media.currentTime,
- paused = _player$media.paused,
- preload = _player$media.preload,
- readyState = _player$media.readyState;
-
- // Set new source
-
- player.media.src = source.getAttribute('src');
-
- // Prevent loading if preload="none" and the current source isn't loaded (#1044)
- if (preload !== 'none' || readyState) {
- // Restore time
- player.once('loadedmetadata', function () {
- player.currentTime = currentTime;
-
- // Resume playing
- if (!paused) {
- player.play();
- }
- });
-
- // Load new source
- player.media.load();
- }
-
- // Trigger change event
- triggerEvent.call(player, player.media, 'qualitychange', false, {
- quality: input
- });
-
- // Save to storage
- player.storage.set({ quality: input });
- }
- });
- },
-
-
- // Cancel current network requests
- // See https://github.com/sampotts/plyr/issues/174
- cancelRequests: function cancelRequests() {
- if (!this.isHTML5) {
- return;
- }
-
- // Remove child sources
- removeElement(html5.getSources.call(this));
-
- // Set blank video src attribute
- // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
- // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
- this.media.setAttribute('src', this.config.blankVideo);
-
- // Load the new empty source
- // This will cancel existing requests
- // See https://github.com/sampotts/plyr/issues/174
- this.media.load();
-
- // Debugging
- this.debug.log('Cancelled network requests');
- }
- };
-
- // ==========================================================================
-
- // Remove duplicates in an array
- function dedupe(array) {
- if (!is$1.array(array)) {
- return array;
- }
-
- return array.filter(function (item, index) {
- return array.indexOf(item) === index;
- });
- }
-
- // Get the closest value in an array
- function closest(array, value) {
- if (!is$1.array(array) || !array.length) {
- return null;
- }
-
- return array.reduce(function (prev, curr) {
- return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
- });
- }
-
- // ==========================================================================
-
- // Clone nested objects
- function cloneDeep(object) {
- return JSON.parse(JSON.stringify(object));
- }
-
- // Get a nested value in an object
- function getDeep(object, path) {
- return path.split('.').reduce(function (obj, key) {
- return obj && obj[key];
- }, object);
- }
-
- // Deep extend destination object with N more objects
- function extend() {
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
- for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- sources[_key - 1] = arguments[_key];
- }
-
- if (!sources.length) {
- return target;
- }
-
- var source = sources.shift();
-
- if (!is$1.object(source)) {
- return target;
- }
-
- Object.keys(source).forEach(function (key) {
- if (is$1.object(source[key])) {
- if (!Object.keys(target).includes(key)) {
- Object.assign(target, defineProperty$1({}, key, {}));
- }
-
- extend(target[key], source[key]);
- } else {
- Object.assign(target, defineProperty$1({}, key, source[key]));
- }
- });
-
- return extend.apply(undefined, [target].concat(sources));
- }
-
- // ==========================================================================
-
- // Generate a random ID
- function generateId(prefix) {
- return prefix + '-' + Math.floor(Math.random() * 10000);
- }
-
- // Format string
- function format(input) {
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
-
- if (is$1.empty(input)) {
- return input;
- }
-
- return input.toString().replace(/{(\d+)}/g, function (match, i) {
- return args[i].toString();
- });
- }
-
- // Get percentage
- function getPercentage(current, max) {
- if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
- return 0;
- }
-
- return (current / max * 100).toFixed(2);
- }
-
- // Replace all occurances of a string in a string
- function replaceAll() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
-
- return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
- }
-
- // Convert to title case
- function toTitleCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class
+
+ toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class
+
+ toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls
+
+ this.ready = true; // Ready event at end of execution stack
+
+ setTimeout(function () {
+ triggerEvent.call(_this, _this.media, 'ready');
+ }, 0); // Set the title
+
+ ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created
+
+ if (this.poster) {
+ ui.setPoster.call(this, this.poster, false).catch(function () {});
+ } // Manually set the duration if user has overridden it.
+ // The event listeners for it doesn't get called if preload is disabled (#701)
+
+
+ if (this.config.duration) {
+ controls.durationUpdate.call(this);
+ }
+ },
+ // Setup aria attribute for play and iframe title
+ setTitle: function setTitle() {
+ // Find the current text
+ var label = i18n.get('play', this.config); // If there's a media title set, use that for the label
+
+ if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {
+ label += ", ".concat(this.config.title);
+ } // If there's a play button, set label
+
+
+ Array.from(this.elements.buttons.play || []).forEach(function (button) {
+ button.setAttribute('aria-label', label);
+ }); // Set iframe title
+ // https://github.com/sampotts/plyr/issues/124
+
+ if (this.isEmbed) {
+ var iframe = getElement.call(this, 'iframe');
+
+ if (!is$1.element(iframe)) {
+ return;
+ } // Default to media type
+
+
+ var title = !is$1.empty(this.config.title) ? this.config.title : 'video';
+ var format = i18n.get('frameTitle', this.config);
+ iframe.setAttribute('title', format.replace('{title}', title));
+ }
+ },
+ // Toggle poster
+ togglePoster: function togglePoster(enable) {
+ toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
+ },
+ // Set the poster image (async)
+ // Used internally for the poster setter, with the passive option forced to false
+ setPoster: function setPoster(poster) {
+ var _this2 = this;
+
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ // Don't override if call is passive
+ if (passive && this.poster) {
+ return Promise.reject(new Error('Poster already set'));
+ } // Set property synchronously to respect the call order
+
+
+ this.media.setAttribute('poster', poster); // Wait until ui is ready
+
+ return ready.call(this) // Load image
+ .then(function () {
+ return loadImage(poster);
+ }).catch(function (err) {
+ // Hide poster on error unless it's been set by another call
+ if (poster === _this2.poster) {
+ ui.togglePoster.call(_this2, false);
+ } // Rethrow
+
+
+ throw err;
+ }).then(function () {
+ // Prevent race conditions
+ if (poster !== _this2.poster) {
+ throw new Error('setPoster cancelled by later call to setPoster');
+ }
+ }).then(function () {
+ Object.assign(_this2.elements.poster.style, {
+ backgroundImage: "url('".concat(poster, "')"),
+ // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
+ backgroundSize: ''
+ });
+ ui.togglePoster.call(_this2, true);
+ return poster;
+ });
+ },
+ // Check playing state
+ checkPlaying: function checkPlaying(event) {
+ var _this3 = this;
+
+ // Class hooks
+ toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
+ toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
+ toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state
+
+ Array.from(this.elements.buttons.play || []).forEach(function (target) {
+ target.pressed = _this3.playing;
+ }); // Only update controls on non timeupdate events
+
+ if (is$1.event(event) && event.type === 'timeupdate') {
+ return;
+ } // Toggle controls
+
+
+ ui.toggleControls.call(this);
+ },
+ // Check if media is loading
+ checkLoading: function checkLoading(event) {
+ var _this4 = this;
+
+ this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer
+
+ clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking
+
+ this.timers.loading = setTimeout(function () {
+ // Update progress bar loading class state
+ toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility
+
+ ui.toggleControls.call(_this4);
+ }, this.loading ? 250 : 0);
+ },
+ // Toggle controls based on state and `force` argument
+ toggleControls: function toggleControls(force) {
+ var controls$$1 = this.elements.controls;
+
+ if (controls$$1 && this.config.hideControls) {
+ // Show controls if force, loading, paused, or button interaction, otherwise hide
+ this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover));
+ }
+ }
+ };
+
+ var Listeners =
+ /*#__PURE__*/
+ function () {
+ function Listeners(player) {
+ _classCallCheck(this, Listeners);
+
+ this.player = player;
+ this.lastKey = null;
+ this.focusTimer = null;
+ this.lastKeyDown = null;
+ this.handleKey = this.handleKey.bind(this);
+ this.toggleMenu = this.toggleMenu.bind(this);
+ this.setTabFocus = this.setTabFocus.bind(this);
+ this.firstTouch = this.firstTouch.bind(this);
+ } // Handle key presses
+
+
+ _createClass(Listeners, [{
+ key: "handleKey",
+ value: function handleKey(event) {
+ var player = this.player;
+ var elements = player.elements;
+ var code = event.keyCode ? event.keyCode : event.which;
+ var pressed = event.type === 'keydown';
+ var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set
+
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
+ return;
+ } // If the event is bubbled from the media element
+ // Firefox doesn't get the keycode for whatever reason
+
+
+ if (!is$1.number(code)) {
+ return;
+ } // Seek by the number keys
+
+
+ var seekByKey = function seekByKey() {
+ // Divide the max duration into 10th's and times by the number value
+ player.currentTime = player.duration / 10 * (code - 48);
+ }; // Handle the key on keydown
+ // Reset on keyup
+
+
+ if (pressed) {
+ // Check focused element
+ // and if the focused element is not editable (e.g. text input)
+ // and any that accept key input http://webaim.org/techniques/keyboard/
+ var focused = document.activeElement;
+
+ if (is$1.element(focused)) {
+ var editable = player.config.selectors.editable;
+ var seek = elements.inputs.seek;
+
+ if (focused !== seek && matches(focused, editable)) {
+ return;
+ }
+
+ if (event.which === 32 && matches(focused, 'button, [role^="menuitem"]')) {
+ return;
+ }
+ } // Which keycodes should we prevent default
+
+
+ var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows)
+
+ if (preventDefault.includes(code)) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+
+ switch (code) {
+ case 48:
+ case 49:
+ case 50:
+ case 51:
+ case 52:
+ case 53:
+ case 54:
+ case 55:
+ case 56:
+ case 57:
+ // 0-9
+ if (!repeat) {
+ seekByKey();
+ }
+
+ break;
+
+ case 32:
+ case 75:
+ // Space and K key
+ if (!repeat) {
+ player.togglePlay();
+ }
+
+ break;
+
+ case 38:
+ // Arrow up
+ player.increaseVolume(0.1);
+ break;
+
+ case 40:
+ // Arrow down
+ player.decreaseVolume(0.1);
+ break;
+
+ case 77:
+ // M key
+ if (!repeat) {
+ player.muted = !player.muted;
+ }
+
+ break;
+
+ case 39:
+ // Arrow forward
+ player.forward();
+ break;
+
+ case 37:
+ // Arrow back
+ player.rewind();
+ break;
+
+ case 70:
+ // F key
+ player.fullscreen.toggle();
+ break;
+
+ case 67:
+ // C key
+ if (!repeat) {
+ player.toggleCaptions();
+ }
+
+ break;
+
+ case 76:
+ // L key
+ player.loop = !player.loop;
+ break;
+
+ /* case 73:
+ this.setLoop('start');
+ break;
+ case 76:
+ this.setLoop();
+ break;
+ case 79:
+ this.setLoop('end');
+ break; */
+
+ default:
+ break;
+ } // Escape is handle natively when in full screen
+ // So we only need to worry about non native
+
+
+ if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {
+ player.fullscreen.toggle();
+ } // Store last code for next cycle
+
+
+ this.lastKey = code;
+ } else {
+ this.lastKey = null;
+ }
+ } // Toggle menu
+
+ }, {
+ key: "toggleMenu",
+ value: function toggleMenu(event) {
+ controls.toggleMenu.call(this.player, event);
+ } // Device is touch enabled
+
+ }, {
+ key: "firstTouch",
+ value: function firstTouch() {
+ var player = this.player;
+ var elements = player.elements;
+ player.touch = true; // Add touch class
+
+ toggleClass(elements.container, player.config.classNames.isTouch, true);
+ }
+ }, {
+ key: "setTabFocus",
+ value: function setTabFocus(event) {
+ var player = this.player;
+ var elements = player.elements;
+ clearTimeout(this.focusTimer); // Ignore any key other than tab
+
+ if (event.type === 'keydown' && event.which !== 9) {
+ return;
+ } // Store reference to event timeStamp
+
+
+ if (event.type === 'keydown') {
+ this.lastKeyDown = event.timeStamp;
+ } // Remove current classes
+
+
+ var removeCurrent = function removeCurrent() {
+ var className = player.config.classNames.tabFocus;
+ var current = getElements.call(player, ".".concat(className));
+ toggleClass(current, className, false);
+ }; // Determine if a key was pressed to trigger this event
+
+
+ var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
+
+ if (event.type === 'focus' && !wasKeyDown) {
+ return;
+ } // Remove all current
+
+
+ removeCurrent(); // Delay the adding of classname until the focus has changed
+ // This event fires before the focusin event
+
+ this.focusTimer = setTimeout(function () {
+ var focused = document.activeElement; // Ignore if current focus element isn't inside the player
+
+ if (!elements.container.contains(focused)) {
+ return;
+ }
+
+ toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
+ }, 10);
+ } // Global window & document listeners
+
+ }, {
+ key: "global",
+ value: function global() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+ var player = this.player; // Keyboard shortcuts
+
+ if (player.config.keyboard.global) {
+ toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
+ } // Click anywhere closes menu
+
+
+ toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events
+
+ once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
+
+ toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);
+ } // Container listeners
+
+ }, {
+ key: "container",
+ value: function container() {
+ var player = this.player;
+ var elements = player.elements; // Keyboard shortcuts
+
+ if (!player.config.keyboard.global && player.config.keyboard.focused) {
+ on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
+ } // Toggle controls on mouse events and entering fullscreen
+
+
+ on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
+ var controls$$1 = elements.controls; // Remove button states for fullscreen
+
+ if (controls$$1 && event.type === 'enterfullscreen') {
+ controls$$1.pressed = false;
+ controls$$1.hover = false;
+ } // Show, then hide after a timeout unless another control event occurs
+
+
+ var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
+ var delay = 0;
+
+ if (show) {
+ ui.toggleControls.call(player, true); // Use longer timeout for touch devices
+
+ delay = player.touch ? 3000 : 2000;
+ } // Clear timer
+
+
+ clearTimeout(player.timers.controls); // Set new timer to prevent flicker when seeking
+
+ player.timers.controls = setTimeout(function () {
+ return ui.toggleControls.call(player, false);
+ }, delay);
+ });
+ } // Listen for media events
+
+ }, {
+ key: "media",
+ value: function media() {
+ var player = this.player;
+ var elements = player.elements; // Time change on media
+
+ on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
+ return controls.timeUpdate.call(player, event);
+ }); // Display duration
+
+ on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {
+ return controls.durationUpdate.call(player, event);
+ }); // Check for audio tracks on load
+ // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
+
+ on.call(player, player.media, 'canplay', function () {
+ toggleHidden(elements.volume, !player.hasAudio);
+ toggleHidden(elements.buttons.mute, !player.hasAudio);
+ }); // Handle the media finishing
+
+ on.call(player, player.media, 'ended', function () {
+ // Show poster on end
+ if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {
+ // Restart
+ player.restart();
+ }
+ }); // Check for buffer progress
+
+ on.call(player, player.media, 'progress playing seeking seeked', function (event) {
+ return controls.updateProgress.call(player, event);
+ }); // Handle volume changes
+
+ on.call(player, player.media, 'volumechange', function (event) {
+ return controls.updateVolume.call(player, event);
+ }); // Handle play/pause
+
+ on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {
+ return ui.checkPlaying.call(player, event);
+ }); // Loading state
+
+ on.call(player, player.media, 'waiting canplay seeked playing', function (event) {
+ return ui.checkLoading.call(player, event);
+ }); // If autoplay, then load advertisement if required
+ // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows
+
+ on.call(player, player.media, 'playing', function () {
+ if (!player.ads) {
+ return;
+ } // If ads are enabled, wait for them first
+
+
+ if (player.ads.enabled && !player.ads.initialized) {
+ // Wait for manager response
+ player.ads.managerPromise.then(function () {
+ return player.ads.play();
+ }).catch(function () {
+ return player.play();
+ });
+ }
+ }); // Click video
+
+ if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {
+ // Re-fetch the wrapper
+ var wrapper = getElement.call(player, ".".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)
+
+ if (!is$1.element(wrapper)) {
+ return;
+ } // On click play, pause ore restart
+
+
+ on.call(player, elements.container, 'click', function (event) {
+ var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper
+
+ if (!targets.includes(event.target) && !wrapper.contains(event.target)) {
+ return;
+ } // Touch devices will just show controls (if hidden)
+
+
+ if (player.touch && player.config.hideControls) {
+ return;
+ }
+
+ if (player.ended) {
+ player.restart();
+ player.play();
+ } else {
+ player.togglePlay();
+ }
+ });
+ } // Disable right click
+
+
+ if (player.supported.ui && player.config.disableContextMenu) {
+ on.call(player, elements.wrapper, 'contextmenu', function (event) {
+ event.preventDefault();
+ }, false);
+ } // Volume change
+
+
+ on.call(player, player.media, 'volumechange', function () {
+ // Save to storage
+ player.storage.set({
+ volume: player.volume,
+ muted: player.muted
+ });
+ }); // Speed change
+
+ on.call(player, player.media, 'ratechange', function () {
+ // Update UI
+ controls.updateSetting.call(player, 'speed'); // Save to storage
+
+
+ player.storage.set({
+ speed: player.speed
+ });
+ }); // Quality change
+
+ on.call(player, player.media, 'qualitychange', function (event) {
+ // Update UI
+ controls.updateSetting.call(player, 'quality', null, event.detail.quality);
+ }); // Proxy events to container
+ // Bubble up key events for Edge
+
+ var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');
+ on.call(player, player.media, proxyEvents, function (event) {
+ var _event$detail = event.detail,
+ detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media
+
+ if (event.type === 'error') {
+ detail = player.media.error;
+ }
+
+ triggerEvent.call(player, elements.container, event.type, true, detail);
+ });
+ } // Run default and custom handlers
+
+ }, {
+ key: "proxy",
+ value: function proxy(event, defaultHandler, customHandlerKey) {
+ var player = this.player;
+ var customHandler = player.config.listeners[customHandlerKey];
+ var hasCustomHandler = is$1.function(customHandler);
+ var returned = true; // Execute custom handler
+
+ if (hasCustomHandler) {
+ returned = customHandler.call(player, event);
+ } // Only call default handler if not prevented in custom handler
+
+
+ if (returned && is$1.function(defaultHandler)) {
+ defaultHandler.call(player, event);
+ }
+ } // Trigger custom and default handlers
+
+ }, {
+ key: "bind",
+ value: function bind(element, type, defaultHandler, customHandlerKey) {
+ var _this = this;
+
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
+ var player = this.player;
+ var customHandler = player.config.listeners[customHandlerKey];
+ var hasCustomHandler = is$1.function(customHandler);
+ on.call(player, element, type, function (event) {
+ return _this.proxy(event, defaultHandler, customHandlerKey);
+ }, passive && !hasCustomHandler);
+ } // Listen for control events
+
+ }, {
+ key: "controls",
+ value: function controls$$1() {
+ var _this2 = this;
+
+ var player = this.player;
+ var elements = player.elements; // IE doesn't support input event, so we fallback to change
+
+ var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle
+
+ if (elements.buttons.play) {
+ Array.from(elements.buttons.play).forEach(function (button) {
+ _this2.bind(button, 'click', player.togglePlay, 'play');
+ });
+ } // Pause
+
+
+ this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+
+ this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind
+
+ this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle
+
+ this.bind(elements.buttons.mute, 'click', function () {
+ player.muted = !player.muted;
+ }, 'mute'); // Captions toggle
+
+ this.bind(elements.buttons.captions, 'click', function () {
+ return player.toggleCaptions();
+ }); // Fullscreen toggle
+
+ this.bind(elements.buttons.fullscreen, 'click', function () {
+ player.fullscreen.toggle();
+ }, 'fullscreen'); // Picture-in-Picture
+
+ this.bind(elements.buttons.pip, 'click', function () {
+ player.pip = 'toggle';
+ }, 'pip'); // Airplay
+
+ this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle
+
+ this.bind(elements.buttons.settings, 'click', function (event) {
+ // Prevent the document click listener closing the menu
+ event.stopPropagation();
+
+ controls.toggleMenu.call(player, event);
+ }); // Settings menu - keyboard toggle
+ // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
+
+ this.bind(elements.buttons.settings, 'keyup', function (event) {
+ var code = event.which; // We only care about space and return
+
+ if (![13, 32].includes(code)) {
+ return;
+ } // Because return triggers a click anyway, all we need to do is set focus
+
+
+ if (code === 13) {
+ controls.focusFirstMenuItem.call(player, null, true);
+
+ return;
+ } // Prevent scroll
+
+
+ event.preventDefault(); // Prevent playing video (Firefox)
+
+ event.stopPropagation(); // Toggle menu
+
+ controls.toggleMenu.call(player, event);
+ }, null, false // Can't be passive as we're preventing default
+ ); // Escape closes menu
+
+ this.bind(elements.settings.menu, 'keydown', function (event) {
+ if (event.which === 27) {
+ controls.toggleMenu.call(player, event);
+ }
+ }); // Set range input alternative "value", which matches the tooltip time (#954)
+
+ this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {
+ var rect = elements.progress.getBoundingClientRect();
+ var percent = 100 / rect.width * (event.pageX - rect.left);
+ event.currentTarget.setAttribute('seek-value', percent);
+ }); // Pause while seeking
+
+ this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
+ var seek = event.currentTarget;
+ var code = event.keyCode ? event.keyCode : event.which;
+ var attribute = 'play-on-seeked';
+
+ if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {
+ return;
+ } // Was playing before?
+
+
+ var play = seek.hasAttribute(attribute); // Done seeking
+
+ var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback
+
+ if (play && done) {
+ seek.removeAttribute(attribute);
+ player.play();
+ } else if (!done && player.playing) {
+ seek.setAttribute(attribute, '');
+ player.pause();
+ }
+ }); // Fix range inputs on iOS
+ // Super weird iOS bug where after you interact with an <input type="range">,
+ // it takes over further interactions on the page. This is a hack
+
+ if (browser.isIos) {
+ var inputs = getElements.call(player, 'input[type="range"]');
+ Array.from(inputs).forEach(function (input) {
+ return _this2.bind(input, inputEvent, function (event) {
+ return repaint(event.target);
+ });
+ });
+ } // Seek
+
+
+ this.bind(elements.inputs.seek, inputEvent, function (event) {
+ var seek = event.currentTarget; // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
+
+ var seekTo = seek.getAttribute('seek-value');
+
+ if (is$1.empty(seekTo)) {
+ seekTo = seek.value;
+ }
+
+ seek.removeAttribute('seek-value');
+ player.currentTime = seekTo / seek.max * player.duration;
+ }, 'seek'); // Seek tooltip
+
+ this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
+ return controls.updateSeekTooltip.call(player, event);
+ }); // Polyfill for lower fill in <input type="range"> for webkit
+
+ if (browser.isWebkit) {
+ Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
+ _this2.bind(element, 'input', function (event) {
+ return controls.updateRangeFill.call(player, event.target);
+ });
+ });
+ } // Current time invert
+ // Only if one time element is used for both currentTime and duration
+
+
+ if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {
+ this.bind(elements.display.currentTime, 'click', function () {
+ // Do nothing if we're at the start
+ if (player.currentTime === 0) {
+ return;
+ }
+
+ player.config.invertTime = !player.config.invertTime;
+
+ controls.timeUpdate.call(player);
+ });
+ } // Volume
+
+
+ this.bind(elements.inputs.volume, inputEvent, function (event) {
+ player.volume = event.target.value;
+ }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
+
+ this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
+ elements.controls.hover = !player.touch && event.type === 'mouseenter';
+ }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
+
+ this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
+ elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
+ }); // Focus in/out on controls
+
+ this.bind(elements.controls, 'focusin focusout', function (event) {
+ var config = player.config,
+ elements = player.elements,
+ timers = player.timers;
+ var isFocusIn = event.type === 'focusin'; // Skip transition to prevent focus from scrolling the parent element
+
+ toggleClass(elements.controls, config.classNames.noTransition, isFocusIn); // Toggle
+
+ ui.toggleControls.call(player, isFocusIn); // If focusin, hide again after delay
+
+ if (isFocusIn) {
+ // Restore transition
+ setTimeout(function () {
+ toggleClass(elements.controls, config.classNames.noTransition, false);
+ }, 0); // Delay a little more for keyboard users
+
+ var delay = _this2.touch ? 3000 : 4000; // Clear timer
+
+ clearTimeout(timers.controls); // Hide
+
+ timers.controls = setTimeout(function () {
+ return ui.toggleControls.call(player, false);
+ }, delay);
+ }
+ }); // Mouse wheel for volume
+
+ this.bind(elements.inputs.volume, 'wheel', function (event) {
+ // Detect "natural" scroll - suppored on OS X Safari only
+ // Other browsers on OS X will be inverted until support improves
+ var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true
+
+ var _map = [event.deltaX, -event.deltaY].map(function (value) {
+ return inverted ? -value : value;
+ }),
+ _map2 = _slicedToArray(_map, 2),
+ x = _map2[0],
+ y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)
+
+
+ var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%
+
+ player.increaseVolume(direction / 50); // Don't break page scrolling at max and min
+
+ var volume = player.media.volume;
+
+ if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {
+ event.preventDefault();
+ }
+ }, 'volume', false);
+ }
+ }]);
+
+ return Listeners;
+ }();
+
+ var dP$3 = _objectDp.f;
+ var FProto = Function.prototype;
+ var nameRE = /^\s*function ([^ (]*)/;
+ var NAME$1 = 'name';
+
+ // 19.2.4.2 name
+ NAME$1 in FProto || _descriptors && dP$3(FProto, NAME$1, {
+ configurable: true,
+ get: function () {
+ try {
+ return ('' + this).match(nameRE)[1];
+ } catch (e) {
+ return '';
+ }
+ }
+ });
+
+ // @@match logic
+ _fixReWks('match', 1, function (defined, MATCH, $match) {
+ // 21.1.3.11 String.prototype.match(regexp)
+ return [function match(regexp) {
+ var O = defined(this);
+ var fn = regexp == undefined ? undefined : regexp[MATCH];
+ return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
+ }, $match];
+ });
+
+ var loadjs_umd = createCommonjsModule(function (module, exports) {
+ (function(root, factory) {
+ if (typeof undefined === 'function' && undefined.amd) {
+ undefined([], factory);
+ } else {
+ module.exports = factory();
+ }
+ }(commonjsGlobal, function() {
+ /**
+ * Global dependencies.
+ * @global {Object} document - DOM
+ */
+
+ var devnull = function() {},
+ bundleIdCache = {},
+ bundleResultCache = {},
+ bundleCallbackQueue = {};
+
+
+ /**
+ * Subscribe to bundle load event.
+ * @param {string[]} bundleIds - Bundle ids
+ * @param {Function} callbackFn - The callback function
+ */
+ function subscribe(bundleIds, callbackFn) {
+ // listify
+ bundleIds = bundleIds.push ? bundleIds : [bundleIds];
+
+ var depsNotFound = [],
+ i = bundleIds.length,
+ numWaiting = i,
+ fn,
+ bundleId,
+ r,
+ q;
+
+ // define callback function
+ fn = function (bundleId, pathsNotFound) {
+ if (pathsNotFound.length) depsNotFound.push(bundleId);
+
+ numWaiting--;
+ if (!numWaiting) callbackFn(depsNotFound);
+ };
+
+ // register callback
+ while (i--) {
+ bundleId = bundleIds[i];
+
+ // execute callback if in result cache
+ r = bundleResultCache[bundleId];
+ if (r) {
+ fn(bundleId, r);
+ continue;
+ }
+
+ // add to callback queue
+ q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
+ q.push(fn);
+ }
+ }
+
+
+ /**
+ * Publish bundle load event.
+ * @param {string} bundleId - Bundle id
+ * @param {string[]} pathsNotFound - List of files not found
+ */
+ function publish(bundleId, pathsNotFound) {
+ // exit if id isn't defined
+ if (!bundleId) return;
+
+ var q = bundleCallbackQueue[bundleId];
+
+ // cache result
+ bundleResultCache[bundleId] = pathsNotFound;
+
+ // exit if queue is empty
+ if (!q) return;
+
+ // empty callback queue
+ while (q.length) {
+ q[0](bundleId, pathsNotFound);
+ q.splice(0, 1);
+ }
+ }
+
+
+ /**
+ * Execute callbacks.
+ * @param {Object or Function} args - The callback args
+ * @param {string[]} depsNotFound - List of dependencies not found
+ */
+ function executeCallbacks(args, depsNotFound) {
+ // accept function as argument
+ if (args.call) args = {success: args};
+
+ // success and error callbacks
+ if (depsNotFound.length) (args.error || devnull)(depsNotFound);
+ else (args.success || devnull)(args);
+ }
+
+
+ /**
+ * Load individual file.
+ * @param {string} path - The file path
+ * @param {Function} callbackFn - The callback function
+ */
+ function loadFile(path, callbackFn, args, numTries) {
+ var doc = document,
+ async = args.async,
+ maxTries = (args.numRetries || 0) + 1,
+ beforeCallbackFn = args.before || devnull,
+ pathStripped = path.replace(/^(css|img)!/, ''),
+ isCss,
+ e;
+
+ numTries = numTries || 0;
+
+ if (/(^css!|\.css$)/.test(path)) {
+ isCss = true;
+
+ // css
+ e = doc.createElement('link');
+ e.rel = 'stylesheet';
+ e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
+ } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
+ // image
+ e = doc.createElement('img');
+ e.src = pathStripped;
+ } else {
+ // javascript
+ e = doc.createElement('script');
+ e.src = path;
+ e.async = async === undefined ? true : async;
+ }
+
+ e.onload = e.onerror = e.onbeforeload = function (ev) {
+ var result = ev.type[0];
+
+ // Note: The following code isolates IE using `hideFocus` and treats empty
+ // stylesheets as failures to get around lack of onerror support
+ if (isCss && 'hideFocus' in e) {
+ try {
+ if (!e.sheet.cssText.length) result = 'e';
+ } catch (x) {
+ // sheets objects created from load errors don't allow access to
+ // `cssText`
+ result = 'e';
+ }
+ }
+
+ // handle retries in case of load failure
+ if (result == 'e') {
+ // increment counter
+ numTries += 1;
+
+ // exit function and try again
+ if (numTries < maxTries) {
+ return loadFile(path, callbackFn, args, numTries);
+ }
+ }
+
+ // execute callback
+ callbackFn(path, result, ev.defaultPrevented);
+ };
+
+ // add to document (unless callback returns `false`)
+ if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
+ }
+
+
+ /**
+ * Load multiple files.
+ * @param {string[]} paths - The file paths
+ * @param {Function} callbackFn - The callback function
+ */
+ function loadFiles(paths, callbackFn, args) {
+ // listify paths
+ paths = paths.push ? paths : [paths];
+
+ var numWaiting = paths.length,
+ x = numWaiting,
+ pathsNotFound = [],
+ fn,
+ i;
+
+ // define callback function
+ fn = function(path, result, defaultPrevented) {
+ // handle error
+ if (result == 'e') pathsNotFound.push(path);
+
+ // handle beforeload event. If defaultPrevented then that means the load
+ // will be blocked (ex. Ghostery/ABP on Safari)
+ if (result == 'b') {
+ if (defaultPrevented) pathsNotFound.push(path);
+ else return;
+ }
+
+ numWaiting--;
+ if (!numWaiting) callbackFn(pathsNotFound);
+ };
+
+ // load scripts
+ for (i=0; i < x; i++) loadFile(paths[i], fn, args);
+ }
+
+
+ /**
+ * Initiate script load and register bundle.
+ * @param {(string|string[])} paths - The file paths
+ * @param {(string|Function)} [arg1] - The bundleId or success callback
+ * @param {Function} [arg2] - The success or error callback
+ * @param {Function} [arg3] - The error callback
+ */
+ function loadjs(paths, arg1, arg2) {
+ var bundleId,
+ args;
+
+ // bundleId (if string)
+ if (arg1 && arg1.trim) bundleId = arg1;
+
+ // args (default is {})
+ args = (bundleId ? arg2 : arg1) || {};
+
+ // throw error if bundle is already defined
+ if (bundleId) {
+ if (bundleId in bundleIdCache) {
+ throw "LoadJS";
+ } else {
+ bundleIdCache[bundleId] = true;
+ }
+ }
+
+ // load scripts
+ loadFiles(paths, function (pathsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, pathsNotFound);
+
+ // publish bundle load event
+ publish(bundleId, pathsNotFound);
+ }, args);
+ }
+
+
+ /**
+ * Execute callbacks when dependencies have been satisfied.
+ * @param {(string|string[])} deps - List of bundle ids
+ * @param {Object} args - success/error arguments
+ */
+ loadjs.ready = function ready(deps, args) {
+ // subscribe to bundle load event
+ subscribe(deps, function (depsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, depsNotFound);
+ });
+
+ return loadjs;
+ };
+
+
+ /**
+ * Manually satisfy bundle dependencies.
+ * @param {string} bundleId - The bundle id
+ */
+ loadjs.done = function done(bundleId) {
+ publish(bundleId, []);
+ };
+
+
+ /**
+ * Reset loadjs dependencies statuses
+ */
+ loadjs.reset = function reset() {
+ bundleIdCache = {};
+ bundleResultCache = {};
+ bundleCallbackQueue = {};
+ };
+
+
+ /**
+ * Determine if bundle has already been defined
+ * @param String} bundleId - The bundle id
+ */
+ loadjs.isDefined = function isDefined(bundleId) {
+ return bundleId in bundleIdCache;
+ };
+
+
+ // export
+ return loadjs;
+
+ }));
+ });
+
+ function loadScript(url) {
+ return new Promise(function (resolve, reject) {
+ loadjs_umd(url, {
+ success: resolve,
+ error: reject
+ });
+ });
+ }
+
+ function parseId(url) {
+ if (is$1.empty(url)) {
+ return null;
+ }
+
+ if (is$1.number(Number(url))) {
+ return url;
+ }
+
+ var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+ } // Get aspect ratio for dimensions
+
+
+ function getAspectRatio(width, height) {
+ var getRatio = function getRatio(w, h) {
+ return h === 0 ? w : getRatio(h, w % h);
+ };
+
+ var ratio = getRatio(width, height);
+ return "".concat(width / ratio, ":").concat(height / ratio);
+ } // Set playback state and trigger change (only on actual change)
+
+
+ function assurePlaybackState(play) {
+ if (play && !this.embed.hasPlayed) {
+ this.embed.hasPlayed = true;
+ }
+
+ if (this.media.paused === play) {
+ this.media.paused = !play;
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
+ }
+ }
+
+ var vimeo = {
+ setup: function setup() {
+ var _this = this;
+
+ // Add embed class for responsive
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio
+
+ vimeo.setAspectRatio.call(this); // Load the API if not already
+
+ if (!is$1.object(window.Vimeo)) {
+ loadScript(this.config.urls.vimeo.sdk).then(function () {
+ vimeo.ready.call(_this);
+ }).catch(function (error) {
+ _this.debug.warn('Vimeo API failed to load', error);
+ });
+ } else {
+ vimeo.ready.call(this);
+ }
+ },
+ // Set aspect ratio
+ // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI
+ setAspectRatio: function setAspectRatio(input) {
+ var _split = (is$1.string(input) ? input : this.config.ratio).split(':'),
+ _split2 = _slicedToArray(_split, 2),
+ x = _split2[0],
+ y = _split2[1];
+
+ var padding = 100 / x * y;
+ this.elements.wrapper.style.paddingBottom = "".concat(padding, "%");
+
+ if (this.supported.ui) {
+ var height = 240;
+ var offset = (height - padding) / (height / 50);
+ this.media.style.transform = "translateY(-".concat(offset, "%)");
+ }
+ },
+ // API Ready
+ ready: function ready$$1() {
+ var _this2 = this;
+
+ var player = this; // Get Vimeo params for the iframe
+
+ var options = {
+ loop: player.config.loop.active,
+ autoplay: player.autoplay,
+ // muted: player.muted,
+ byline: false,
+ portrait: false,
+ title: false,
+ speed: true,
+ transparent: 0,
+ gesture: 'media',
+ playsinline: !this.config.fullscreen.iosNative
+ };
+ var params = buildUrlParams(options); // Get the source URL or ID
+
+ var source = player.media.getAttribute('src'); // Get from <div> if needed
+
+ if (is$1.empty(source)) {
+ source = player.media.getAttribute(player.config.attributes.embed.id);
+ }
+
+ var id = parseId(source); // Build an iframe
+
+ var iframe = createElement('iframe');
+ var src = format(player.config.urls.vimeo.iframe, id, params);
+ iframe.setAttribute('src', src);
+ iframe.setAttribute('allowfullscreen', '');
+ iframe.setAttribute('allowtransparency', '');
+ iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set
+
+ var poster = player.poster; // Inject the package
+
+ var wrapper = createElement('div', {
+ poster: poster,
+ class: player.config.classNames.embedContainer
+ });
+ wrapper.appendChild(iframe);
+ player.media = replaceElement(wrapper, player.media); // Get poster image
+
+ fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
+ if (is$1.empty(response)) {
+ return;
+ } // Get the URL for thumbnail
+
+
+ var url = new URL(response[0].thumbnail_large); // Get original image
+
+ url.pathname = "".concat(url.pathname.split('_')[0], ".jpg"); // Set and show poster
+
+ ui.setPoster.call(player, url.href).catch(function () {});
+ }); // Setup instance
+ // https://github.com/vimeo/player.js
+
+ player.embed = new window.Vimeo.Player(iframe, {
+ autopause: player.config.autopause,
+ muted: player.muted
+ });
+ player.media.paused = true;
+ player.media.currentTime = 0; // Disable native text track rendering
+
+ if (player.supported.ui) {
+ player.embed.disableTextTrack();
+ } // Create a faux HTML5 API using the Vimeo API
+
+
+ player.media.play = function () {
+ assurePlaybackState.call(player, true);
+ return player.embed.play();
+ };
+
+ player.media.pause = function () {
+ assurePlaybackState.call(player, false);
+ return player.embed.pause();
+ };
+
+ player.media.stop = function () {
+ player.pause();
+ player.currentTime = 0;
+ }; // Seeking
+
+
+ var currentTime = player.media.currentTime;
+ Object.defineProperty(player.media, 'currentTime', {
+ get: function get() {
+ return currentTime;
+ },
+ set: function set(time) {
+ // Vimeo will automatically play on seek if the video hasn't been played before
+ // Get current paused state and volume etc
+ var embed = player.embed,
+ media = player.media,
+ paused = player.paused,
+ volume = player.volume;
+ var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event
+
+ media.seeking = true;
+ triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete
+
+ Promise.resolve(restorePause && embed.setVolume(0)) // Seek
+ .then(function () {
+ return embed.setCurrentTime(time);
+ }) // Restore paused
+ .then(function () {
+ return restorePause && embed.pause();
+ }) // Restore volume
+ .then(function () {
+ return restorePause && embed.setVolume(volume);
+ }).catch(function () {// Do nothing
+ });
+ }
+ }); // Playback speed
+
+ var speed = player.config.speed.selected;
+ Object.defineProperty(player.media, 'playbackRate', {
+ get: function get() {
+ return speed;
+ },
+ set: function set(input) {
+ player.embed.setPlaybackRate(input).then(function () {
+ speed = input;
+ triggerEvent.call(player, player.media, 'ratechange');
+ }).catch(function (error) {
+ // Hide menu item (and menu if empty)
+ if (error.name === 'Error') {
+ controls.setSpeedMenu.call(player, []);
+ }
+ });
+ }
+ }); // Volume
+
+ var volume = player.config.volume;
+ Object.defineProperty(player.media, 'volume', {
+ get: function get() {
+ return volume;
+ },
+ set: function set(input) {
+ player.embed.setVolume(input).then(function () {
+ volume = input;
+ triggerEvent.call(player, player.media, 'volumechange');
+ });
+ }
+ }); // Muted
+
+ var muted = player.config.muted;
+ Object.defineProperty(player.media, 'muted', {
+ get: function get() {
+ return muted;
+ },
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : false;
+ player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
+ muted = toggle;
+ triggerEvent.call(player, player.media, 'volumechange');
+ });
+ }
+ }); // Loop
+
+ var loop = player.config.loop;
+ Object.defineProperty(player.media, 'loop', {
+ get: function get() {
+ return loop;
+ },
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : player.config.loop.active;
+ player.embed.setLoop(toggle).then(function () {
+ loop = toggle;
+ });
+ }
+ }); // Source
+
+ var currentSrc;
+ player.embed.getVideoUrl().then(function (value) {
+ currentSrc = value;
+ }).catch(function (error) {
+ _this2.debug.warn(error);
+ });
+ Object.defineProperty(player.media, 'currentSrc', {
+ get: function get() {
+ return currentSrc;
+ }
+ }); // Ended
+
+ Object.defineProperty(player.media, 'ended', {
+ get: function get() {
+ return player.currentTime === player.duration;
+ }
+ }); // Set aspect ratio based on video size
+
+ Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
+ var ratio = getAspectRatio(dimensions[0], dimensions[1]);
+ vimeo.setAspectRatio.call(_this2, ratio);
+ }); // Set autopause
+
+ player.embed.setAutopause(player.config.autopause).then(function (state) {
+ player.config.autopause = state;
+ }); // Get title
+
+ player.embed.getVideoTitle().then(function (title) {
+ player.config.title = title;
+ ui.setTitle.call(_this2);
+ }); // Get current time
+
+ player.embed.getCurrentTime().then(function (value) {
+ currentTime = value;
+ triggerEvent.call(player, player.media, 'timeupdate');
+ }); // Get duration
+
+ player.embed.getDuration().then(function (value) {
+ player.media.duration = value;
+ triggerEvent.call(player, player.media, 'durationchange');
+ }); // Get captions
+
+ player.embed.getTextTracks().then(function (tracks) {
+ player.media.textTracks = tracks;
+ captions.setup.call(player);
+ });
+ player.embed.on('cuechange', function (_ref) {
+ var _ref$cues = _ref.cues,
+ cues = _ref$cues === void 0 ? [] : _ref$cues;
+ var strippedCues = cues.map(function (cue) {
+ return stripHTML(cue.text);
+ });
+ captions.updateCues.call(player, strippedCues);
+ });
+ player.embed.on('loaded', function () {
+ // Assure state and events are updated on autoplay
+ player.embed.getPaused().then(function (paused) {
+ assurePlaybackState.call(player, !paused);
+
+ if (!paused) {
+ triggerEvent.call(player, player.media, 'playing');
+ }
+ });
+
+ if (is$1.element(player.embed.element) && player.supported.ui) {
+ var frame = player.embed.element; // Fix keyboard focus issues
+ // https://github.com/sampotts/plyr/issues/317
+
+ frame.setAttribute('tabindex', -1);
+ }
+ });
+ player.embed.on('play', function () {
+ assurePlaybackState.call(player, true);
+ triggerEvent.call(player, player.media, 'playing');
+ });
+ player.embed.on('pause', function () {
+ assurePlaybackState.call(player, false);
+ });
+ player.embed.on('timeupdate', function (data) {
+ player.media.seeking = false;
+ currentTime = data.seconds;
+ triggerEvent.call(player, player.media, 'timeupdate');
+ });
+ player.embed.on('progress', function (data) {
+ player.media.buffered = data.percent;
+ triggerEvent.call(player, player.media, 'progress'); // Check all loaded
+
+ if (parseInt(data.percent, 10) === 1) {
+ triggerEvent.call(player, player.media, 'canplaythrough');
+ } // Get duration as if we do it before load, it gives an incorrect value
+ // https://github.com/sampotts/plyr/issues/891
+
+
+ player.embed.getDuration().then(function (value) {
+ if (value !== player.media.duration) {
+ player.media.duration = value;
+ triggerEvent.call(player, player.media, 'durationchange');
+ }
+ });
+ });
+ player.embed.on('seeked', function () {
+ player.media.seeking = false;
+ triggerEvent.call(player, player.media, 'seeked');
+ });
+ player.embed.on('ended', function () {
+ player.media.paused = true;
+ triggerEvent.call(player, player.media, 'ended');
+ });
+ player.embed.on('error', function (detail) {
+ player.media.error = detail;
+ triggerEvent.call(player, player.media, 'error');
+ }); // Rebuild UI
+
+ setTimeout(function () {
+ return ui.build.call(player);
+ }, 0);
+ }
+ };
+
+ function parseId$1(url) {
+ if (is$1.empty(url)) {
+ return null;
+ }
+
+ var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+ } // Set playback state and trigger change (only on actual change)
+
+
+ function assurePlaybackState$1(play) {
+ if (play && !this.embed.hasPlayed) {
+ this.embed.hasPlayed = true;
+ }
+
+ if (this.media.paused === play) {
+ this.media.paused = !play;
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
+ }
+ }
+
+ var youtube = {
+ setup: function setup() {
+ var _this = this;
+
+ // Add embed class for responsive
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio
+
+ youtube.setAspectRatio.call(this); // Setup API
+
+ if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {
+ youtube.ready.call(this);
+ } else {
+ // Load the API
+ loadScript(this.config.urls.youtube.sdk).catch(function (error) {
+ _this.debug.warn('YouTube API failed to load', error);
+ }); // Setup callback for the API
+ // YouTube has it's own system of course...
+
+ window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue
+
+ window.onYouTubeReadyCallbacks.push(function () {
+ youtube.ready.call(_this);
+ }); // Set callback to process queue
+
+ window.onYouTubeIframeAPIReady = function () {
+ window.onYouTubeReadyCallbacks.forEach(function (callback) {
+ callback();
+ });
+ };
+ }
+ },
+ // Get the media title
+ getTitle: function getTitle(videoId) {
+ var _this2 = this;
+
+ // Try via undocumented API method first
+ // This method disappears now and then though...
+ // https://github.com/sampotts/plyr/issues/709
+ if (is$1.function(this.embed.getVideoData)) {
+ var _this$embed$getVideoD = this.embed.getVideoData(),
+ title = _this$embed$getVideoD.title;
+
+ if (is$1.empty(title)) {
+ this.config.title = title;
+ ui.setTitle.call(this);
+ return;
+ }
+ } // Or via Google API
+
+
+ var key = this.config.keys.google;
+
+ if (is$1.string(key) && !is$1.empty(key)) {
+ var url = format(this.config.urls.youtube.api, videoId, key);
+ fetch(url).then(function (result) {
+ if (is$1.object(result)) {
+ _this2.config.title = result.items[0].snippet.title;
+ ui.setTitle.call(_this2);
+ }
+ }).catch(function () {});
+ }
+ },
+ // Set aspect ratio
+ setAspectRatio: function setAspectRatio() {
+ var ratio = this.config.ratio.split(':');
+ this.elements.wrapper.style.paddingBottom = "".concat(100 / ratio[0] * ratio[1], "%");
+ },
+ // API ready
+ ready: function ready$$1() {
+ var player = this; // Ignore already setup (race condition)
+
+ var currentId = player.media.getAttribute('id');
+
+ if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {
+ return;
+ } // Get the source URL or ID
+
+
+ var source = player.media.getAttribute('src'); // Get from <div> if needed
+
+ if (is$1.empty(source)) {
+ source = player.media.getAttribute(this.config.attributes.embed.id);
+ } // Replace the <iframe> with a <div> due to YouTube API issues
+
+
+ var videoId = parseId$1(source);
+ var id = generateId(player.provider); // Get poster, if already set
+
+ var poster = player.poster; // Replace media element
+
+ var container = createElement('div', {
+ id: id,
+ poster: poster
+ });
+ player.media = replaceElement(container, player.media); // Id to poster wrapper
+
+ var posterSrc = function posterSrc(format$$1) {
+ return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg");
+ }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
+
+
+ loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
+ .catch(function () {
+ return loadImage(posterSrc('sd'), 121);
+ }) // 480p padded 4:3
+ .catch(function () {
+ return loadImage(posterSrc('hq'));
+ }) // 360p padded 4:3. Always exists
+ .then(function (image) {
+ return ui.setPoster.call(player, image.src);
+ }).then(function (posterSrc) {
+ // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
+ if (!posterSrc.includes('maxres')) {
+ player.elements.poster.style.backgroundSize = 'cover';
+ }
+ }).catch(function () {}); // Setup instance
+ // https://developers.google.com/youtube/iframe_api_reference
+
+ player.embed = new window.YT.Player(id, {
+ videoId: videoId,
+ playerVars: {
+ autoplay: player.config.autoplay ? 1 : 0,
+ // Autoplay
+ hl: player.config.hl,
+ // iframe interface language
+ controls: player.supported.ui ? 0 : 1,
+ // Only show controls if not fully supported
+ rel: 0,
+ // No related vids
+ showinfo: 0,
+ // Hide info
+ iv_load_policy: 3,
+ // Hide annotations
+ modestbranding: 1,
+ // Hide logos as much as possible (they still show one in the corner when paused)
+ disablekb: 1,
+ // Disable keyboard as we handle it
+ playsinline: 1,
+ // Allow iOS inline playback
+ // Tracking for stats
+ // origin: window ? `${window.location.protocol}//${window.location.host}` : null,
+ widget_referrer: window ? window.location.href : null,
+ // Captions are flaky on YouTube
+ cc_load_policy: player.captions.active ? 1 : 0,
+ cc_lang_pref: player.config.captions.language
+ },
+ events: {
+ onError: function onError(event) {
+ // YouTube may fire onError twice, so only handle it once
+ if (!player.media.error) {
+ var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
+
+ var message = {
+ 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
+ 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
+ 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
+ 101: 'The owner of the requested video does not allow it to be played in embedded players.',
+ 150: 'The owner of the requested video does not allow it to be played in embedded players.'
+ }[code] || 'An unknown error occured';
+ player.media.error = {
+ code: code,
+ message: message
+ };
+ triggerEvent.call(player, player.media, 'error');
+ }
+ },
+ onPlaybackRateChange: function onPlaybackRateChange(event) {
+ // Get the instance
+ var instance = event.target; // Get current speed
+
+ player.media.playbackRate = instance.getPlaybackRate();
+ triggerEvent.call(player, player.media, 'ratechange');
+ },
+ onReady: function onReady(event) {
+ // Bail if onReady has already been called. See issue #1108
+ if (is$1.function(player.media.play)) {
+ return;
+ } // Get the instance
+
+
+ var instance = event.target; // Get the title
+
+ youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API
+
+ player.media.play = function () {
+ assurePlaybackState$1.call(player, true);
+ instance.playVideo();
+ };
+
+ player.media.pause = function () {
+ assurePlaybackState$1.call(player, false);
+ instance.pauseVideo();
+ };
+
+ player.media.stop = function () {
+ instance.stopVideo();
+ };
+
+ player.media.duration = instance.getDuration();
+ player.media.paused = true; // Seeking
+
+ player.media.currentTime = 0;
+ Object.defineProperty(player.media, 'currentTime', {
+ get: function get() {
+ return Number(instance.getCurrentTime());
+ },
+ set: function set(time) {
+ // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
+ if (player.paused && !player.embed.hasPlayed) {
+ player.embed.mute();
+ } // Set seeking state and trigger event
+
+
+ player.media.seeking = true;
+ triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent
+
+ instance.seekTo(time);
+ }
+ }); // Playback speed
+
+ Object.defineProperty(player.media, 'playbackRate', {
+ get: function get() {
+ return instance.getPlaybackRate();
+ },
+ set: function set(input) {
+ instance.setPlaybackRate(input);
+ }
+ }); // Volume
+
+ var volume = player.config.volume;
+ Object.defineProperty(player.media, 'volume', {
+ get: function get() {
+ return volume;
+ },
+ set: function set(input) {
+ volume = input;
+ instance.setVolume(volume * 100);
+ triggerEvent.call(player, player.media, 'volumechange');
+ }
+ }); // Muted
+
+ var muted = player.config.muted;
+ Object.defineProperty(player.media, 'muted', {
+ get: function get() {
+ return muted;
+ },
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : muted;
+ muted = toggle;
+ instance[toggle ? 'mute' : 'unMute']();
+ triggerEvent.call(player, player.media, 'volumechange');
+ }
+ }); // Source
+
+ Object.defineProperty(player.media, 'currentSrc', {
+ get: function get() {
+ return instance.getVideoUrl();
+ }
+ }); // Ended
+
+ Object.defineProperty(player.media, 'ended', {
+ get: function get() {
+ return player.currentTime === player.duration;
+ }
+ }); // Get available speeds
+
+ player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe
+
+ if (player.supported.ui) {
+ player.media.setAttribute('tabindex', -1);
+ }
+
+ triggerEvent.call(player, player.media, 'timeupdate');
+ triggerEvent.call(player, player.media, 'durationchange'); // Reset timer
+
+ clearInterval(player.timers.buffering); // Setup buffering
+
+ player.timers.buffering = setInterval(function () {
+ // Get loaded % from YouTube
+ player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something
+
+ if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
+ triggerEvent.call(player, player.media, 'progress');
+ } // Set last buffer point
+
+
+ player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%
+
+ if (player.media.buffered === 1) {
+ clearInterval(player.timers.buffering); // Trigger event
+
+ triggerEvent.call(player, player.media, 'canplaythrough');
+ }
+ }, 200); // Rebuild UI
+
+ setTimeout(function () {
+ return ui.build.call(player);
+ }, 50);
+ },
+ onStateChange: function onStateChange(event) {
+ // Get the instance
+ var instance = event.target; // Reset timer
+
+ clearInterval(player.timers.playing);
+ var seeked = player.media.seeking && [1, 2].includes(event.data);
+
+ if (seeked) {
+ // Unset seeking and fire seeked event
+ player.media.seeking = false;
+ triggerEvent.call(player, player.media, 'seeked');
+ } // Handle events
+ // -1 Unstarted
+ // 0 Ended
+ // 1 Playing
+ // 2 Paused
+ // 3 Buffering
+ // 5 Video cued
+
+
+ switch (event.data) {
+ case -1:
+ // Update scrubber
+ triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube
+
+ player.media.buffered = instance.getVideoLoadedFraction();
+ triggerEvent.call(player, player.media, 'progress');
+ break;
+
+ case 0:
+ assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.
+
+ if (player.media.loop) {
+ // YouTube needs a call to `stopVideo` before playing again
+ instance.stopVideo();
+ instance.playVideo();
+ } else {
+ triggerEvent.call(player, player.media, 'ended');
+ }
+
+ break;
+
+ case 1:
+ // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
+ if (player.media.paused && !player.embed.hasPlayed) {
+ player.media.pause();
+ } else {
+ assurePlaybackState$1.call(player, true);
+ triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress
+
+ player.timers.playing = setInterval(function () {
+ triggerEvent.call(player, player.media, 'timeupdate');
+ }, 50); // Check duration again due to YouTube bug
+ // https://github.com/sampotts/plyr/issues/374
+ // https://code.google.com/p/gdata-issues/issues/detail?id=8690
+
+ if (player.media.duration !== instance.getDuration()) {
+ player.media.duration = instance.getDuration();
+ triggerEvent.call(player, player.media, 'durationchange');
+ }
+ }
+
+ break;
+
+ case 2:
+ // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
+ if (!player.muted) {
+ player.embed.unMute();
+ }
+
+ assurePlaybackState$1.call(player, false);
+ break;
+
+ default:
+ break;
+ }
+
+ triggerEvent.call(player, player.elements.container, 'statechange', false, {
+ code: event.data
+ });
+ }
+ }
+ });
+ }
+ };
+
+ var media = {
+ // Setup media
+ setup: function setup() {
+ // If there's no media, bail
+ if (!this.media) {
+ this.debug.warn('No media element found!');
+ return;
+ } // Add type class
+
+
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class
+
+ toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds
+ // This will require changes if audio embeds are added
+
+ if (this.isEmbed) {
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
+ } // Inject the player wrapper
+
+
+ if (this.isVideo) {
+ // Create the wrapper div
+ this.elements.wrapper = createElement('div', {
+ class: this.config.classNames.video
+ }); // Wrap the video in a container
+
+ wrap(this.media, this.elements.wrapper); // Faux poster container
+
+ this.elements.poster = createElement('div', {
+ class: this.config.classNames.poster
+ });
+ this.elements.wrapper.appendChild(this.elements.poster);
+ }
+
+ if (this.isHTML5) {
+ html5.extend.call(this);
+ } else if (this.isYouTube) {
+ youtube.setup.call(this);
+ } else if (this.isVimeo) {
+ vimeo.setup.call(this);
+ }
+ }
+ };
+
+ var Ads =
+ /*#__PURE__*/
+ function () {
+ /**
+ * Ads constructor.
+ * @param {object} player
+ * @return {Ads}
+ */
+ function Ads(player) {
+ var _this = this;
+
+ _classCallCheck(this, Ads);
+
+ this.player = player;
+ this.publisherId = player.config.ads.publisherId;
+ this.playing = false;
+ this.initialized = false;
+ this.elements = {
+ container: null,
+ displayContainer: null
+ };
+ this.manager = null;
+ this.loader = null;
+ this.cuePoints = null;
+ this.events = {};
+ this.safetyTimer = null;
+ this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready
+
+ this.managerPromise = new Promise(function (resolve, reject) {
+ // The ad is loaded and ready
+ _this.on('loaded', resolve); // Ads failed
+
+
+ _this.on('error', reject);
+ });
+ this.load();
+ }
+
+ _createClass(Ads, [{
+ key: "load",
+
+ /**
+ * Load the IMA SDK
+ */
+ value: function load() {
+ var _this2 = this;
+
+ if (this.enabled) {
+ // Check if the Google IMA3 SDK is loaded or load it ourselves
+ if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {
+ loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
+ _this2.ready();
+ }).catch(function () {
+ // Script failed to load or is blocked
+ _this2.trigger('error', new Error('Google IMA SDK failed to load'));
+ });
+ } else {
+ this.ready();
+ }
+ }
+ }
+ /**
+ * Get the ads instance ready
+ */
+
+ }, {
+ key: "ready",
+ value: function ready$$1() {
+ var _this3 = this;
+
+ // Start ticking our safety timer. If the whole advertisement
+ // thing doesn't resolve within our set time; we bail
+ this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
+
+ this.managerPromise.then(function () {
+ _this3.clearSafetyTimer('onAdsManagerLoaded()');
+ }); // Set listeners on the Plyr instance
+
+ this.listeners(); // Setup the IMA SDK
+
+ this.setupIMA();
+ } // Build the default tag URL
+
+ }, {
+ key: "setupIMA",
+
+ /**
+ * In order for the SDK to display ads for our video, we need to tell it where to put them,
+ * so here we define our ad container. This div is set up to render on top of the video player.
+ * Using the code below, we tell the SDK to render ads within that div. We also provide a
+ * handle to the content video player - the SDK will poll the current time of our player to
+ * properly place mid-rolls. After we create the ad display container, we initialize it. On
+ * mobile devices, this initialization is done as the result of a user action.
+ */
+ value: function setupIMA() {
+ // Create the container for our advertisements
+ this.elements.container = createElement('div', {
+ class: this.player.config.classNames.ads
+ });
+ this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
+
+ google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language
+
+ google.ima.settings.setLocale(this.player.config.ads.language); // We assume the adContainer is the video container of the plyr element
+ // that will house the ads
+
+ this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container); // Request video ads to be pre-loaded
+
+ this.requestAds();
+ }
+ /**
+ * Request advertisements
+ */
+
+ }, {
+ key: "requestAds",
+ value: function requestAds() {
+ var _this4 = this;
+
+ var container = this.player.elements.container;
+
+ try {
+ // Create ads loader
+ this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
+
+ this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
+ return _this4.onAdsManagerLoaded(event);
+ }, false);
+ this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this4.onAdError(error);
+ }, false); // Request video ads
+
+ var request = new google.ima.AdsRequest();
+ request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
+ // to select the correct creative if multiple are returned
+
+ request.linearAdSlotWidth = container.offsetWidth;
+ request.linearAdSlotHeight = container.offsetHeight;
+ request.nonLinearAdSlotWidth = container.offsetWidth;
+ request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.
+
+ request.forceNonLinearFullSlot = false; // Mute based on current state
+
+ request.setAdWillPlayMuted(!this.player.muted);
+ this.loader.requestAds(request);
+ } catch (e) {
+ this.onAdError(e);
+ }
+ }
+ /**
+ * Update the ad countdown
+ * @param {boolean} start
+ */
+
+ }, {
+ key: "pollCountdown",
+ value: function pollCountdown() {
+ var _this5 = this;
+
+ var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ if (!start) {
+ clearInterval(this.countdownTimer);
+ this.elements.container.removeAttribute('data-badge-text');
+ return;
+ }
+
+ var update = function update() {
+ var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
+ var label = "".concat(i18n.get('advertisement', _this5.player.config), " - ").concat(time);
+
+ _this5.elements.container.setAttribute('data-badge-text', label);
+ };
+
+ this.countdownTimer = setInterval(update, 100);
+ }
+ /**
+ * This method is called whenever the ads are ready inside the AdDisplayContainer
+ * @param {Event} adsManagerLoadedEvent
+ */
+
+ }, {
+ key: "onAdsManagerLoaded",
+ value: function onAdsManagerLoaded(event) {
+ var _this6 = this;
+
+ // Load could occur after a source change (race condition)
+ if (!this.enabled) {
+ return;
+ } // Get the ads manager
+
+
+ var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf
+
+ settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
+ settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration
+ // so it can determine when to start the mid- and post-roll
+
+ this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
+
+ this.cuePoints = this.manager.getCuePoints(); // Add advertisement cue's within the time line if available
+
+ if (!is$1.empty(this.cuePoints)) {
+ this.cuePoints.forEach(function (cuePoint) {
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this6.player.duration) {
+ var seekElement = _this6.player.elements.progress;
+
+ if (is$1.element(seekElement)) {
+ var cuePercentage = 100 / _this6.player.duration * cuePoint;
+ var cue = createElement('span', {
+ class: _this6.player.config.classNames.cues
+ });
+ cue.style.left = "".concat(cuePercentage.toString(), "%");
+ seekElement.appendChild(cue);
+ }
+ }
+ });
+ } // Set volume to match player
+
+
+ this.manager.setVolume(this.player.volume); // Add listeners to the required events
+ // Advertisement error events
+
+ this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this6.onAdError(error);
+ }); // Advertisement regular events
+
+ Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
+ _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {
+ return _this6.onAdEvent(event);
+ });
+ }); // Resolve our adsManager
+
+ this.trigger('loaded');
+ }
+ /**
+ * This is where all the event handling takes place. Retrieve the ad from the event. Some
+ * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
+ * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
+ * @param {Event} event
+ */
+
+ }, {
+ key: "onAdEvent",
+ value: function onAdEvent(event) {
+ var _this7 = this;
+
+ var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
+ // don't have ad object associated
+
+ var ad = event.getAd(); // Proxy event
+
+ var dispatchEvent = function dispatchEvent(type) {
+ var event = "ads".concat(type.replace(/_/g, '').toLowerCase());
+ triggerEvent.call(_this7.player, _this7.player.media, event);
+ };
+
+ switch (event.type) {
+ case google.ima.AdEvent.Type.LOADED:
+ // This is the first event sent for an ad - it is possible to determine whether the
+ // ad is a video ad or an overlay
+ this.trigger('loaded'); // Bubble event
+
+ dispatchEvent(event.type); // Start countdown
+
+ this.pollCountdown(true);
+
+ if (!ad.isLinear()) {
+ // Position AdDisplayContainer correctly for overlay
+ ad.width = container.offsetWidth;
+ ad.height = container.offsetHeight;
+ } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
+ // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
+
+
+ break;
+
+ case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
+ // All ads for the current videos are done. We can now request new advertisements
+ // in case the video is re-played
+ // Fire event
+ dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded.
+ // So here we load a new video when all ads are done.
+ // Then we load new ads within a new adsManager. When the video
+ // Is started - after - the ads are loaded, then we get ads.
+ // You can also easily test cancelling and reloading by running
+ // player.ads.cancel() and player.ads.play from the console I guess.
+ // this.player.source = {
+ // type: 'video',
+ // title: 'View From A Blue Moon',
+ // sources: [{
+ // src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
+ // 'video/mp4', }], poster:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
+ // [ { kind: 'captions', label: 'English', srclang: 'en', src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
+ // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
+ // };
+ // TODO: So there is still this thing where a video should only be allowed to start
+ // playing when the IMA SDK is ready or has failed
+
+ this.loadAds();
+ break;
+
+ case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
+ // This event indicates the ad has started - the video player can adjust the UI,
+ // for example display a pause button and remaining time. Fired when content should
+ // be paused. This usually happens right before an ad is about to cover the content
+ dispatchEvent(event.type);
+ this.pauseContent();
+ break;
+
+ case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
+ // This event indicates the ad has finished - the video player can perform
+ // appropriate UI actions, such as removing the timer for remaining time detection.
+ // Fired when content should be resumed. This usually happens when an ad finishes
+ // or collapses
+ dispatchEvent(event.type);
+ this.pollCountdown();
+ this.resumeContent();
+ break;
+
+ case google.ima.AdEvent.Type.STARTED:
+ case google.ima.AdEvent.Type.MIDPOINT:
+ case google.ima.AdEvent.Type.COMPLETE:
+ case google.ima.AdEvent.Type.IMPRESSION:
+ case google.ima.AdEvent.Type.CLICK:
+ dispatchEvent(event.type);
+ break;
+
+ default:
+ break;
+ }
+ }
+ /**
+ * Any ad error handling comes through here
+ * @param {Event} event
+ */
+
+ }, {
+ key: "onAdError",
+ value: function onAdError(event) {
+ this.cancel();
+ this.player.debug.warn('Ads error', event);
+ }
+ /**
+ * Setup hooks for Plyr and window events. This ensures
+ * the mid- and post-roll launch at the correct time. And
+ * resize the advertisement when the player resizes
+ */
+
+ }, {
+ key: "listeners",
+ value: function listeners() {
+ var _this8 = this;
+
+ var container = this.player.elements.container;
+ var time; // Add listeners to the required events
+
+ this.player.on('ended', function () {
+ _this8.loader.contentComplete();
+ });
+ this.player.on('seeking', function () {
+ time = _this8.player.currentTime;
+ return time;
+ });
+ this.player.on('seeked', function () {
+ var seekedTime = _this8.player.currentTime;
+
+ if (is$1.empty(_this8.cuePoints)) {
+ return;
+ }
+
+ _this8.cuePoints.forEach(function (cuePoint, index) {
+ if (time < cuePoint && cuePoint < seekedTime) {
+ _this8.manager.discardAdBreak();
+
+ _this8.cuePoints.splice(index, 1);
+ }
+ });
+ }); // Listen to the resizing of the window. And resize ad accordingly
+ // TODO: eventually implement ResizeObserver
+
+ window.addEventListener('resize', function () {
+ if (_this8.manager) {
+ _this8.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ }
+ });
+ }
+ /**
+ * Initialize the adsManager and start playing advertisements
+ */
+
+ }, {
+ key: "play",
+ value: function play() {
+ var _this9 = this;
+
+ var container = this.player.elements.container;
+
+ if (!this.managerPromise) {
+ this.resumeContent();
+ } // Play the requested advertisement whenever the adsManager is ready
+
+
+ this.managerPromise.then(function () {
+ // Initialize the container. Must be done via a user action on mobile devices
+ _this9.elements.displayContainer.initialize();
+
+ try {
+ if (!_this9.initialized) {
+ // Initialize the ads manager. Ad rules playlist will start at this time
+ _this9.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
+ // start at this time; the call will be ignored for ad rules
+
+
+ _this9.manager.start();
+ }
+
+ _this9.initialized = true;
+ } catch (adError) {
+ // An error may be thrown if there was a problem with the
+ // VAST response
+ _this9.onAdError(adError);
+ }
+ }).catch(function () {});
+ }
+ /**
+ * Resume our video
+ */
+
+ }, {
+ key: "resumeContent",
+ value: function resumeContent() {
+ // Hide the advertisement container
+ this.elements.container.style.zIndex = ''; // Ad is stopped
+
+ this.playing = false; // Play our video
+
+ if (this.player.currentTime < this.player.duration) {
+ this.player.play();
+ }
+ }
+ /**
+ * Pause our video
+ */
+
+ }, {
+ key: "pauseContent",
+ value: function pauseContent() {
+ // Show the advertisement container
+ this.elements.container.style.zIndex = 3; // Ad is playing.
+
+ this.playing = true; // Pause our video.
+
+ this.player.pause();
+ }
+ /**
+ * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
+ * allowed to call new ads based on google policies, as they interpret this as an accidental
+ * video requests. https://developers.google.com/interactive-
+ * media-ads/docs/sdks/android/faq#8
+ */
+
+ }, {
+ key: "cancel",
+ value: function cancel() {
+ // Pause our video
+ if (this.initialized) {
+ this.resumeContent();
+ } // Tell our instance that we're done for now
+
+
+ this.trigger('error'); // Re-create our adsManager
+
+ this.loadAds();
+ }
+ /**
+ * Re-create our adsManager
+ */
+
+ }, {
+ key: "loadAds",
+ value: function loadAds() {
+ var _this10 = this;
+
+ // Tell our adsManager to go bye bye
+ this.managerPromise.then(function () {
+ // Destroy our adsManager
+ if (_this10.manager) {
+ _this10.manager.destroy();
+ } // Re-set our adsManager promises
+
+
+ _this10.managerPromise = new Promise(function (resolve) {
+ _this10.on('loaded', resolve);
+
+ _this10.player.debug.log(_this10.manager);
+ }); // Now request some new advertisements
+
+ _this10.requestAds();
+ }).catch(function () {});
+ }
+ /**
+ * Handles callbacks after an ad event was invoked
+ * @param {string} event - Event type
+ */
+
+ }, {
+ key: "trigger",
+ value: function trigger(event) {
+ var _this11 = this;
+
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var handlers = this.events[event];
+
+ if (is$1.array(handlers)) {
+ handlers.forEach(function (handler) {
+ if (is$1.function(handler)) {
+ handler.apply(_this11, args);
+ }
+ });
+ }
+ }
+ /**
+ * Add event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ * @return {Ads}
+ */
+
+ }, {
+ key: "on",
+ value: function on$$1(event, callback) {
+ if (!is$1.array(this.events[event])) {
+ this.events[event] = [];
+ }
+
+ this.events[event].push(callback);
+ return this;
+ }
+ /**
+ * Setup a safety timer for when the ad network doesn't respond for whatever reason.
+ * The advertisement has 12 seconds to get its things together. We stop this timer when the
+ * advertisement is playing, or when a user action is required to start, then we clear the
+ * timer on ad ready
+ * @param {number} time
+ * @param {string} from
+ */
+
+ }, {
+ key: "startSafetyTimer",
+ value: function startSafetyTimer(time, from) {
+ var _this12 = this;
+
+ this.player.debug.log("Safety timer invoked from: ".concat(from));
+ this.safetyTimer = setTimeout(function () {
+ _this12.cancel();
+
+ _this12.clearSafetyTimer('startSafetyTimer()');
+ }, time);
+ }
+ /**
+ * Clear our safety timer(s)
+ * @param {string} from
+ */
+
+ }, {
+ key: "clearSafetyTimer",
+ value: function clearSafetyTimer(from) {
+ if (!is$1.nullOrUndefined(this.safetyTimer)) {
+ this.player.debug.log("Safety timer cleared from: ".concat(from));
+ clearTimeout(this.safetyTimer);
+ this.safetyTimer = null;
+ }
+ }
+ }, {
+ key: "enabled",
+ get: function get() {
+ return this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is$1.empty(this.publisherId);
+ }
+ }, {
+ key: "tagUrl",
+ get: function get() {
+ var params = {
+ AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
+ AV_CHANNELID: '5a0458dc28a06145e4519d21',
+ AV_URL: window.location.hostname,
+ cb: Date.now(),
+ AV_WIDTH: 640,
+ AV_HEIGHT: 480,
+ AV_CDIM2: this.publisherId
+ };
+ var base = 'https://go.aniview.com/api/adserver6/vast/';
+ return "".concat(base, "?").concat(buildUrlParams(params));
+ }
+ }]);
+
+ return Ads;
+ }();
+
+ var source = {
+ // Add elements to HTML5 media (source, tracks, etc)
+ insertElements: function insertElements(type, attributes) {
+ var _this = this;
+
+ if (is$1.string(attributes)) {
+ insertElement(type, this.media, {
+ src: attributes
+ });
+ } else if (is$1.array(attributes)) {
+ attributes.forEach(function (attribute) {
+ insertElement(type, _this.media, attribute);
+ });
+ }
+ },
+ // Update source
+ // Sources are not checked for support so be careful
+ change: function change(input) {
+ var _this2 = this;
+
+ if (!getDeep(input, 'sources.length')) {
+ this.debug.warn('Invalid source format');
+ return;
+ } // Cancel current network requests
+
+
+ html5.cancelRequests.call(this); // Destroy instance and re-setup
+
+ this.destroy.call(this, function () {
+ // Reset quality options
+ _this2.options.quality = []; // Remove elements
+
+ removeElement(_this2.media);
+ _this2.media = null; // Reset class name
+
+ if (is$1.element(_this2.elements.container)) {
+ _this2.elements.container.removeAttribute('class');
+ } // Set the type and provider
+
+
+ var sources = input.sources,
+ type = input.type;
+
+ var _sources = _slicedToArray(sources, 1),
+ _sources$ = _sources[0],
+ _sources$$provider = _sources$.provider,
+ provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,
+ src = _sources$.src;
+
+ var tagName = provider === 'html5' ? type : 'div';
+ var attributes = provider === 'html5' ? {} : {
+ src: src
+ };
+ Object.assign(_this2, {
+ provider: provider,
+ type: type,
+ // Check for support
+ supported: support.check(type, provider, _this2.config.playsinline),
+ // Create new element
+ media: createElement(tagName, attributes)
+ }); // Inject the new element
+
+ _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?
+
+
+ if (is$1.boolean(input.autoplay)) {
+ _this2.config.autoplay = input.autoplay;
+ } // Set attributes for audio and video
+
+
+ if (_this2.isHTML5) {
+ if (_this2.config.crossorigin) {
+ _this2.media.setAttribute('crossorigin', '');
+ }
+
+ if (_this2.config.autoplay) {
+ _this2.media.setAttribute('autoplay', '');
+ }
+
+ if (!is$1.empty(input.poster)) {
+ _this2.poster = input.poster;
+ }
+
+ if (_this2.config.loop.active) {
+ _this2.media.setAttribute('loop', '');
+ }
+
+ if (_this2.config.muted) {
+ _this2.media.setAttribute('muted', '');
+ }
+
+ if (_this2.config.playsinline) {
+ _this2.media.setAttribute('playsinline', '');
+ }
+ } // Restore class hook
+
+
+ ui.addStyleHook.call(_this2); // Set new sources for html5
+
+ if (_this2.isHTML5) {
+ source.insertElements.call(_this2, 'source', sources);
+ } // Set video title
+
+
+ _this2.config.title = input.title; // Set up from scratch
+
+ media.setup.call(_this2); // HTML5 stuff
+
+ if (_this2.isHTML5) {
+ // Setup captions
+ if ('tracks' in input) {
+ source.insertElements.call(_this2, 'track', input.tracks);
+ } // Load HTML5 sources
+
+
+ _this2.media.load();
+ } // If HTML5 or embed but not fully supported, setupInterface and call ready now
- return input.toString().replace(/\w\S*/g, function (text) {
- return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
- });
- }
-
- // Convert string to pascalCase
- function toPascalCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var string = input.toString();
+ if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
+ // Setup interface
+ ui.build.call(_this2);
+ } // Update the fullscreen support
- // Convert kebab case
- string = replaceAll(string, '-', ' ');
- // Convert snake case
- string = replaceAll(string, '_', ' ');
+ _this2.fullscreen.update();
+ }, true);
+ }
+ };
- // Convert to title case
- string = toTitleCase(string);
+ // TODO: Use a WeakMap for private globals
+ // const globals = new WeakMap();
+ // Plyr instance
- // Convert to pascal case
- return replaceAll(string, ' ', '');
- }
-
- // Convert string to pascalCase
- function toCamelCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
-
- var string = input.toString();
+ var Plyr =
+ /*#__PURE__*/
+ function () {
+ function Plyr(target, options) {
+ var _this = this;
- // Convert to pascal case
- string = toPascalCase(string);
+ _classCallCheck(this, Plyr);
- // Convert first character to lowercase
- return string.charAt(0).toLowerCase() + string.slice(1);
- }
-
- // Remove HTML from a string
- function stripHTML(source) {
- var fragment = document.createDocumentFragment();
- var element = document.createElement('div');
- fragment.appendChild(element);
- element.innerHTML = source;
- return fragment.firstChild.innerText;
- }
-
- // Like outerHTML, but also works for DocumentFragment
- function getHTML(element) {
- var wrapper = document.createElement('div');
- wrapper.appendChild(element);
- return wrapper.innerHTML;
- }
-
- // ==========================================================================
-
- var i18n = {
- get: function get() {
- var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
- if (is$1.empty(key) || is$1.empty(config)) {
- return '';
- }
-
- var string = getDeep(config.i18n, key);
-
- if (is$1.empty(string)) {
- return '';
- }
-
- var replace = {
- '{seektime}': config.seekTime,
- '{title}': config.title
- };
-
- Object.entries(replace).forEach(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- key = _ref2[0],
- value = _ref2[1];
-
- string = replaceAll(string, key, value);
- });
-
- return string;
- }
- };
-
- // ==========================================================================
-
- var Storage = function () {
- function Storage(player) {
- classCallCheck(this, Storage);
-
- this.enabled = player.config.storage.enabled;
- this.key = player.config.storage.key;
- }
-
- // Check for actual support (see if we can use it)
-
-
- createClass(Storage, [{
- key: 'get',
- value: function get(key) {
- if (!Storage.supported || !this.enabled) {
- return null;
- }
-
- var store = window.localStorage.getItem(this.key);
-
- if (is$1.empty(store)) {
- return null;
- }
-
- var json = JSON.parse(store);
-
- return is$1.string(key) && key.length ? json[key] : json;
- }
- }, {
- key: 'set',
- value: function set(object) {
- // Bail if we don't have localStorage support or it's disabled
- if (!Storage.supported || !this.enabled) {
- return;
- }
-
- // Can only store objectst
- if (!is$1.object(object)) {
- return;
- }
-
- // Get current storage
- var storage = this.get();
-
- // Default to empty object
- if (is$1.empty(storage)) {
- storage = {};
- }
-
- // Update the working copy of the values
- extend(storage, object);
-
- // Update storage
- window.localStorage.setItem(this.key, JSON.stringify(storage));
- }
- }], [{
- key: 'supported',
- get: function get() {
- try {
- if (!('localStorage' in window)) {
- return false;
- }
-
- var test = '___test';
-
- // Try to use it (it might be disabled, e.g. user is in private mode)
- // see: https://github.com/sampotts/plyr/issues/131
- window.localStorage.setItem(test, test);
- window.localStorage.removeItem(test);
-
- return true;
- } catch (e) {
- return false;
- }
- }
- }]);
- return Storage;
- }();
-
- // ==========================================================================
- // Fetch wrapper
- // Using XHR to avoid issues with older browsers
- // ==========================================================================
-
- function fetch(url) {
- var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
-
- return new Promise(function (resolve, reject) {
- try {
- var request = new XMLHttpRequest();
-
- // Check for CORS support
- if (!('withCredentials' in request)) {
- return;
- }
-
- request.addEventListener('load', function () {
- if (responseType === 'text') {
- try {
- resolve(JSON.parse(request.responseText));
- } catch (e) {
- resolve(request.responseText);
- }
- } else {
- resolve(request.response);
- }
- });
-
- request.addEventListener('error', function () {
- throw new Error(request.status);
- });
-
- request.open('GET', url, true);
-
- // Set the required response type
- request.responseType = responseType;
-
- request.send();
- } catch (e) {
- reject(e);
- }
- });
- }
-
- // ==========================================================================
-
- // Load an external SVG sprite
- function loadSprite(url, id) {
- if (!is$1.string(url)) {
- return;
- }
-
- var prefix = 'cache';
- var hasId = is$1.string(id);
- var isCached = false;
-
- var exists = function exists() {
- return document.getElementById(id) !== null;
- };
-
- var update = function update(container, data) {
- container.innerHTML = data;
-
- // Check again incase of race condition
- if (hasId && exists()) {
- return;
- }
-
- // Inject the SVG to the body
- document.body.insertAdjacentElement('afterbegin', container);
- };
-
- // Only load once if ID set
- if (!hasId || !exists()) {
- var useStorage = Storage.supported;
-
- // Create container
- var container = document.createElement('div');
- container.setAttribute('hidden', '');
-
- if (hasId) {
- container.setAttribute('id', id);
- }
-
- // Check in cache
- if (useStorage) {
- var cached = window.localStorage.getItem(prefix + '-' + id);
- isCached = cached !== null;
-
- if (isCached) {
- var data = JSON.parse(cached);
- update(container, data.content);
- }
- }
-
- // Get the sprite
- fetch(url).then(function (result) {
- if (is$1.empty(result)) {
- return;
- }
-
- if (useStorage) {
- window.localStorage.setItem(prefix + '-' + id, JSON.stringify({
- content: result
- }));
- }
-
- update(container, result);
- }).catch(function () {});
- }
- }
-
- // ==========================================================================
-
- // Time helpers
- var getHours = function getHours(value) {
- return parseInt(value / 60 / 60 % 60, 10);
- };
- var getMinutes = function getMinutes(value) {
- return parseInt(value / 60 % 60, 10);
- };
- var getSeconds = function getSeconds(value) {
- return parseInt(value % 60, 10);
- };
-
- // Format time to UI friendly string
- function formatTime() {
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
- // Bail if the value isn't a number
- if (!is$1.number(time)) {
- return formatTime(null, displayHours, inverted);
- }
-
- // Format time component to add leading zero
- var format = function format(value) {
- return ('0' + value).slice(-2);
- };
-
- // Breakdown to hours, mins, secs
- var hours = getHours(time);
- var mins = getMinutes(time);
- var secs = getSeconds(time);
-
- // Do we need to display hours?
- if (displayHours || hours > 0) {
- hours = hours + ':';
- } else {
- hours = '';
- }
-
- // Render
- return '' + (inverted && time > 0 ? '-' : '') + hours + format(mins) + ':' + format(secs);
- }
-
- // ==========================================================================
-
- // TODO: Don't export a massive object - break down and create class
- var controls = {
- // Get icon URL
- getIconUrl: function getIconUrl() {
- var url = new URL(this.config.iconUrl, window.location);
- var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
-
- return {
- url: this.config.iconUrl,
- cors: cors
- };
- },
-
-
- // Find the UI controls
- findElements: function findElements() {
- try {
- this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);
-
- // Buttons
- this.elements.buttons = {
- play: getElements.call(this, this.config.selectors.buttons.play),
- pause: getElement.call(this, this.config.selectors.buttons.pause),
- restart: getElement.call(this, this.config.selectors.buttons.restart),
- rewind: getElement.call(this, this.config.selectors.buttons.rewind),
- fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
- mute: getElement.call(this, this.config.selectors.buttons.mute),
- pip: getElement.call(this, this.config.selectors.buttons.pip),
- airplay: getElement.call(this, this.config.selectors.buttons.airplay),
- settings: getElement.call(this, this.config.selectors.buttons.settings),
- captions: getElement.call(this, this.config.selectors.buttons.captions),
- fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)
- };
-
- // Progress
- this.elements.progress = getElement.call(this, this.config.selectors.progress);
-
- // Inputs
- this.elements.inputs = {
- seek: getElement.call(this, this.config.selectors.inputs.seek),
- volume: getElement.call(this, this.config.selectors.inputs.volume)
- };
-
- // Display
- this.elements.display = {
- buffer: getElement.call(this, this.config.selectors.display.buffer),
- currentTime: getElement.call(this, this.config.selectors.display.currentTime),
- duration: getElement.call(this, this.config.selectors.display.duration)
- };
-
- // Seek tooltip
- if (is$1.element(this.elements.progress)) {
- this.elements.display.seekTooltip = this.elements.progress.querySelector('.' + this.config.classNames.tooltip);
- }
-
- return true;
- } catch (error) {
- // Log it
- this.debug.warn('It looks like there is a problem with your custom controls HTML', error);
-
- // Restore native video controls
- this.toggleNativeControls(true);
-
- return false;
- }
- },
-
-
- // Create <svg> icon
- createIcon: function createIcon(type, attributes) {
- var namespace = 'http://www.w3.org/2000/svg';
- var iconUrl = controls.getIconUrl.call(this);
- var iconPath = (!iconUrl.cors ? iconUrl.url : '') + '#' + this.config.iconPrefix;
-
- // Create <svg>
- var icon = document.createElementNS(namespace, 'svg');
- setAttributes(icon, extend(attributes, {
- role: 'presentation',
- focusable: 'false'
- }));
-
- // Create the <use> to reference sprite
- var use = document.createElementNS(namespace, 'use');
- var path = iconPath + '-' + type;
-
- // Set `href` attributes
- // https://github.com/sampotts/plyr/issues/460
- // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
- if ('href' in use) {
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
- } else {
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);
- }
-
- // Add <use> to <svg>
- icon.appendChild(use);
-
- return icon;
- },
-
-
- // Create hidden text label
- createLabel: function createLabel(type) {
- var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
- // Skip i18n for abbreviations and brand names
- var universals = {
- pip: 'PIP',
- airplay: 'AirPlay'
- };
- var text = universals[type] || i18n.get(type, this.config);
-
- var attributes = Object.assign({}, attr, {
- class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')
- });
- return createElement('span', attributes, text);
- },
-
-
- // Create a badge
- createBadge: function createBadge(text) {
- if (is$1.empty(text)) {
- return null;
- }
-
- var badge = createElement('span', {
- class: this.config.classNames.menu.value
- });
-
- badge.appendChild(createElement('span', {
- class: this.config.classNames.menu.badge
- }, text));
-
- return badge;
- },
-
-
- // Create a <button>
- createButton: function createButton(buttonType, attr) {
- var button = createElement('button');
- var attributes = Object.assign({}, attr);
- var type = toCamelCase(buttonType);
-
- var toggle = false;
- var label = void 0;
- var icon = void 0;
- var labelPressed = void 0;
- var iconPressed = void 0;
-
- if (!('type' in attributes)) {
- attributes.type = 'button';
- }
-
- if ('class' in attributes) {
- if (!attributes.class.includes(this.config.classNames.control)) {
- attributes.class += ' ' + this.config.classNames.control;
- }
- } else {
- attributes.class = this.config.classNames.control;
- }
-
- // Large play button
- switch (buttonType) {
- case 'play':
- toggle = true;
- label = 'play';
- labelPressed = 'pause';
- icon = 'play';
- iconPressed = 'pause';
- break;
-
- case 'mute':
- toggle = true;
- label = 'mute';
- labelPressed = 'unmute';
- icon = 'volume';
- iconPressed = 'muted';
- break;
-
- case 'captions':
- toggle = true;
- label = 'enableCaptions';
- labelPressed = 'disableCaptions';
- icon = 'captions-off';
- iconPressed = 'captions-on';
- break;
-
- case 'fullscreen':
- toggle = true;
- label = 'enterFullscreen';
- labelPressed = 'exitFullscreen';
- icon = 'enter-fullscreen';
- iconPressed = 'exit-fullscreen';
- break;
-
- case 'play-large':
- attributes.class += ' ' + this.config.classNames.control + '--overlaid';
- type = 'play';
- label = 'play';
- icon = 'play';
- break;
-
- default:
- label = type;
- icon = buttonType;
- }
-
- // Setup toggle icon and labels
- if (toggle) {
- // Icon
- button.appendChild(controls.createIcon.call(this, iconPressed, {
- class: 'icon--pressed'
- }));
- button.appendChild(controls.createIcon.call(this, icon, {
- class: 'icon--not-pressed'
- }));
-
- // Label/Tooltip
- button.appendChild(controls.createLabel.call(this, labelPressed, {
- class: 'label--pressed'
- }));
- button.appendChild(controls.createLabel.call(this, label, {
- class: 'label--not-pressed'
- }));
- } else {
- button.appendChild(controls.createIcon.call(this, icon));
- button.appendChild(controls.createLabel.call(this, label));
- }
-
- // Merge attributes
- extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
-
- setAttributes(button, attributes);
-
- // We have multiple play buttons
- if (type === 'play') {
- if (!is$1.array(this.elements.buttons[type])) {
- this.elements.buttons[type] = [];
- }
-
- this.elements.buttons[type].push(button);
- } else {
- this.elements.buttons[type] = button;
- }
-
- return button;
- },
-
-
- // Create an <input type='range'>
- createRange: function createRange(type, attributes) {
- // Seek input
- var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
- type: 'range',
- min: 0,
- max: 100,
- step: 0.01,
- value: 0,
- autocomplete: 'off',
- // A11y fixes for https://github.com/sampotts/plyr/issues/905
- role: 'slider',
- 'aria-label': i18n.get(type, this.config),
- 'aria-valuemin': 0,
- 'aria-valuemax': 100,
- 'aria-valuenow': 0
- }, attributes));
-
- this.elements.inputs[type] = input;
-
- // Set the fill for webkit now
- controls.updateRangeFill.call(this, input);
-
- return input;
- },
-
-
- // Create a <progress>
- createProgress: function createProgress(type, attributes) {
- var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {
- min: 0,
- max: 100,
- value: 0,
- role: 'presentation',
- 'aria-hidden': true
- }, attributes));
-
- // Create the label inside
- if (type !== 'volume') {
- progress.appendChild(createElement('span', null, '0'));
-
- var suffixKey = {
- played: 'played',
- buffer: 'buffered'
- }[type];
- var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
-
- progress.innerText = '% ' + suffix.toLowerCase();
- }
-
- this.elements.display[type] = progress;
-
- return progress;
- },
-
-
- // Create time display
- createTime: function createTime(type) {
- var attributes = getAttributesFromSelector(this.config.selectors.display[type]);
-
- var container = createElement('div', extend(attributes, {
- class: (this.config.classNames.display.time + ' ' + (attributes.class ? attributes.class : '')).trim(),
- 'aria-label': i18n.get(type, this.config)
- }), '00:00');
-
- // Reference for updates
- this.elements.display[type] = container;
-
- return container;
- },
-
-
- // Bind keyboard shortcuts for a menu item
- // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
- bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {
- var _this = this;
-
- // Navigate through menus via arrow keys and space
- on(menuItem, 'keydown keyup', function (event) {
- // We only care about space and ⬆️ ⬇️️ ➡️
- if (![32, 38, 39, 40].includes(event.which)) {
- return;
- }
-
- // Prevent play / seek
- event.preventDefault();
- event.stopPropagation();
-
- // We're just here to prevent the keydown bubbling
- if (event.type === 'keydown') {
- return;
- }
-
- var isRadioButton = matches(menuItem, '[role="menuitemradio"]');
-
- // Show the respective menu
- if (!isRadioButton && [32, 39].includes(event.which)) {
- controls.showMenuPanel.call(_this, type, true);
- } else {
- var target = void 0;
-
- if (event.which !== 32) {
- if (event.which === 40 || isRadioButton && event.which === 39) {
- target = menuItem.nextElementSibling;
-
- if (!is$1.element(target)) {
- target = menuItem.parentNode.firstElementChild;
- }
- } else {
- target = menuItem.previousElementSibling;
-
- if (!is$1.element(target)) {
- target = menuItem.parentNode.lastElementChild;
- }
- }
-
- setFocus.call(_this, target, true);
- }
- }
- }, false);
-
- // Enter will fire a `click` event but we still need to manage focus
- // So we bind to keyup which fires after and set focus here
- on(menuItem, 'keyup', function (event) {
- if (event.which !== 13) {
- return;
- }
-
- controls.focusFirstMenuItem.call(_this, null, true);
- });
- },
-
-
- // Create a settings menu item
- createMenuItem: function createMenuItem(_ref) {
- var _this2 = this;
-
- var value = _ref.value,
- list = _ref.list,
- type = _ref.type,
- title = _ref.title,
- _ref$badge = _ref.badge,
- badge = _ref$badge === undefined ? null : _ref$badge,
- _ref$checked = _ref.checked,
- checked = _ref$checked === undefined ? false : _ref$checked;
+ this.timers = {}; // State
- var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);
-
- var menuItem = createElement('button', extend(attributes, {
- type: 'button',
- role: 'menuitemradio',
- class: (this.config.classNames.control + ' ' + (attributes.class ? attributes.class : '')).trim(),
- 'aria-checked': checked,
- value: value
- }));
-
- var flex = createElement('span');
-
- // We have to set as HTML incase of special characters
- flex.innerHTML = title;
-
- if (is$1.element(badge)) {
- flex.appendChild(badge);
- }
-
- menuItem.appendChild(flex);
-
- // Replicate radio button behaviour
- Object.defineProperty(menuItem, 'checked', {
- enumerable: true,
- get: function get() {
- return menuItem.getAttribute('aria-checked') === 'true';
- },
- set: function set(checked) {
- // Ensure exclusivity
- if (checked) {
- Array.from(menuItem.parentNode.children).filter(function (node) {
- return matches(node, '[role="menuitemradio"]');
- }).forEach(function (node) {
- return node.setAttribute('aria-checked', 'false');
- });
- }
-
- menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');
- }
- });
-
- this.listeners.bind(menuItem, 'click keyup', function (event) {
- if (is$1.keyboardEvent(event) && event.which !== 32) {
- return;
- }
-
- event.preventDefault();
- event.stopPropagation();
-
- menuItem.checked = true;
-
- switch (type) {
- case 'language':
- _this2.currentTrack = Number(value);
- break;
-
- case 'quality':
- _this2.quality = value;
- break;
-
- case 'speed':
- _this2.speed = parseFloat(value);
- break;
+ this.ready = false;
+ this.loading = false;
+ this.failed = false; // Touch device
- default:
- break;
- }
-
- controls.showMenuPanel.call(_this2, 'home', is$1.keyboardEvent(event));
- }, type, false);
-
- controls.bindMenuItemShortcuts.call(this, menuItem, type);
-
- list.appendChild(menuItem);
- },
-
-
- // Format a time for display
- formatTime: function formatTime$$1() {
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- // Bail if the value isn't a number
- if (!is$1.number(time)) {
- return time;
- }
-
- // Always display hours if duration is over an hour
- var forceHours = getHours(this.duration) > 0;
-
- return formatTime(time, forceHours, inverted);
- },
-
-
- // Update the displayed time
- updateTimeDisplay: function updateTimeDisplay() {
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ this.touch = support.touch; // Set the media element
- // Bail if there's no element to display or the value isn't a number
- if (!is$1.element(target) || !is$1.number(time)) {
- return;
- }
+ this.media = target; // String selector passed
- // eslint-disable-next-line no-param-reassign
- target.innerText = controls.formatTime(time, inverted);
- },
+ if (is$1.string(this.media)) {
+ this.media = document.querySelectorAll(this.media);
+ } // jQuery, NodeList or Array passed, use first element
- // Update volume UI and storage
- updateVolume: function updateVolume() {
- if (!this.supported.ui) {
- return;
- }
-
- // Update range
- if (is$1.element(this.elements.inputs.volume)) {
- controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
- }
-
- // Update mute state
- if (is$1.element(this.elements.buttons.mute)) {
- this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
- }
- },
-
-
- // Update seek value and lower fill
- setRange: function setRange(target) {
- var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
-
- if (!is$1.element(target)) {
- return;
- }
+ if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {
+ // eslint-disable-next-line
+ this.media = this.media[0];
+ } // Set config
- // eslint-disable-next-line
- target.value = value;
- // Webkit range fill
- controls.updateRangeFill.call(this, target);
- },
+ this.config = extend({}, defaults, Plyr.defaults, options || {}, function () {
+ try {
+ return JSON.parse(_this.media.getAttribute('data-plyr-config'));
+ } catch (e) {
+ return {};
+ }
+ }()); // Elements cache
+ this.elements = {
+ container: null,
+ captions: null,
+ buttons: {},
+ display: {},
+ progress: {},
+ inputs: {},
+ settings: {
+ popup: null,
+ menu: null,
+ panels: {},
+ buttons: {}
+ }
+ }; // Captions
- // Update <progress> elements
- updateProgress: function updateProgress(event) {
- var _this3 = this;
+ this.captions = {
+ active: null,
+ currentTrack: -1,
+ meta: new WeakMap()
+ }; // Fullscreen
- if (!this.supported.ui || !is$1.event(event)) {
- return;
- }
-
- var value = 0;
-
- var setProgress = function setProgress(target, input) {
- var value = is$1.number(input) ? input : 0;
- var progress = is$1.element(target) ? target : _this3.elements.display.buffer;
-
- // Update value and label
- if (is$1.element(progress)) {
- progress.value = value;
-
- // Update text label inside
- var label = progress.getElementsByTagName('span')[0];
- if (is$1.element(label)) {
- label.childNodes[0].nodeValue = value;
- }
- }
- };
-
- if (event) {
- switch (event.type) {
- // Video playing
- case 'timeupdate':
- case 'seeking':
- case 'seeked':
- value = getPercentage(this.currentTime, this.duration);
-
- // Set seek range value only if it's a 'natural' time event
- if (event.type === 'timeupdate') {
- controls.setRange.call(this, this.elements.inputs.seek, value);
- }
-
- break;
-
- // Check buffer status
- case 'playing':
- case 'progress':
- setProgress(this.elements.display.buffer, this.buffered * 100);
-
- break;
-
- default:
- break;
- }
- }
- },
-
-
- // Webkit polyfill for lower fill range
- updateRangeFill: function updateRangeFill(target) {
- // Get range from event if event passed
- var range = is$1.event(target) ? target.target : target;
-
- // Needs to be a valid <input type='range'>
- if (!is$1.element(range) || range.getAttribute('type') !== 'range') {
- return;
- }
-
- // Set aria values for https://github.com/sampotts/plyr/issues/905
- if (matches(range, this.config.selectors.inputs.seek)) {
- range.setAttribute('aria-valuenow', this.currentTime);
- var currentTime = controls.formatTime(this.currentTime);
- var duration = controls.formatTime(this.duration);
- var format$$1 = i18n.get('seekLabel', this.config);
- range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
- } else if (matches(range, this.config.selectors.inputs.volume)) {
- var percent = range.value * 100;
- range.setAttribute('aria-valuenow', percent);
- range.setAttribute('aria-valuetext', percent.toFixed(1) + '%');
- } else {
- range.setAttribute('aria-valuenow', range.value);
- }
-
- // WebKit only
- if (!browser.isWebkit) {
- return;
- }
-
- // Set CSS custom property
- range.style.setProperty('--value', range.value / range.max * 100 + '%');
- },
-
-
- // Update hover tooltip for seeking
- updateSeekTooltip: function updateSeekTooltip(event) {
- var _this4 = this;
-
- // Bail if setting not true
- if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {
- return;
- }
-
- // Calculate percentage
- var percent = 0;
- var clientRect = this.elements.progress.getBoundingClientRect();
- var visible = this.config.classNames.tooltip + '--visible';
-
- var toggle = function toggle(_toggle) {
- toggleClass(_this4.elements.display.seekTooltip, visible, _toggle);
- };
-
- // Hide on touch
- if (this.touch) {
- toggle(false);
- return;
- }
-
- // Determine percentage, if already visible
- if (is$1.event(event)) {
- percent = 100 / clientRect.width * (event.pageX - clientRect.left);
- } else if (hasClass(this.elements.display.seekTooltip, visible)) {
- percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
- } else {
- return;
- }
-
- // Set bounds
- if (percent < 0) {
- percent = 0;
- } else if (percent > 100) {
- percent = 100;
- }
-
- // Display the time a click would seek to
- controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);
-
- // Set position
- this.elements.display.seekTooltip.style.left = percent + '%';
-
- // Show/hide the tooltip
- // If the event is a moues in/out and percentage is inside bounds
- if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
- toggle(event.type === 'mouseenter');
- }
- },
-
-
- // Handle time change event
- timeUpdate: function timeUpdate(event) {
- // Only invert if only one time element is displayed and used for both duration and currentTime
- var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime;
-
- // Duration
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);
-
- // Ignore updates while seeking
- if (event && event.type === 'timeupdate' && this.media.seeking) {
- return;
- }
-
- // Playing progress
- controls.updateProgress.call(this, event);
- },
-
-
- // Show the duration on metadataloaded or durationchange events
- durationUpdate: function durationUpdate() {
- // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
- if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
- return;
- }
-
- // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.
- // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415
- // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062
- // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338
- if (this.duration >= Math.pow(2, 32)) {
- toggleHidden(this.elements.display.currentTime, true);
- toggleHidden(this.elements.progress, true);
- return;
- }
-
- // Update ARIA values
- if (is$1.element(this.elements.inputs.seek)) {
- this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
- }
-
- // If there's a spot to display duration
- var hasDuration = is$1.element(this.elements.display.duration);
-
- // If there's only one time display, display duration there
- if (!hasDuration && this.config.displayDuration && this.paused) {
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
- }
-
- // If there's a duration element, update content
- if (hasDuration) {
- controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
- }
-
- // Update the tooltip (if visible)
- controls.updateSeekTooltip.call(this);
- },
-
-
- // Hide/show a tab
- toggleMenuButton: function toggleMenuButton(setting, toggle) {
- toggleHidden(this.elements.settings.buttons[setting], !toggle);
- },
-
-
- // Update the selected setting
- updateSetting: function updateSetting(setting, container, input) {
- var pane = this.elements.settings.panels[setting];
- var value = null;
- var list = container;
-
- if (setting === 'captions') {
- value = this.currentTrack;
- } else {
- value = !is$1.empty(input) ? input : this[setting];
-
- // Get default
- if (is$1.empty(value)) {
- value = this.config[setting].default;
- }
-
- // Unsupported value
- if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {
- this.debug.warn('Unsupported value of \'' + value + '\' for ' + setting);
- return;
- }
-
- // Disabled value
- if (!this.config[setting].options.includes(value)) {
- this.debug.warn('Disabled value of \'' + value + '\' for ' + setting);
- return;
- }
- }
-
- // Get the list if we need to
- if (!is$1.element(list)) {
- list = pane && pane.querySelector('[role="menu"]');
- }
-
- // If there's no list it means it's not been rendered...
- if (!is$1.element(list)) {
- return;
- }
-
- // Update the label
- var label = this.elements.settings.buttons[setting].querySelector('.' + this.config.classNames.menu.value);
- label.innerHTML = controls.getLabel.call(this, setting, value);
-
- // Find the radio option and check it
- var target = list && list.querySelector('[value="' + value + '"]');
-
- if (is$1.element(target)) {
- target.checked = true;
- }
- },
-
-
- // Translate a value into a nice label
- getLabel: function getLabel(setting, value) {
- switch (setting) {
- case 'speed':
- return value === 1 ? i18n.get('normal', this.config) : value + '&times;';
-
- case 'quality':
- if (is$1.number(value)) {
- var label = i18n.get('qualityLabel.' + value, this.config);
-
- if (!label.length) {
- return value + 'p';
- }
-
- return label;
- }
-
- return toTitleCase(value);
-
- case 'captions':
- return captions.getLabel.call(this);
-
- default:
- return null;
- }
- },
-
-
- // Set the quality menu
- setQualityMenu: function setQualityMenu(options) {
- var _this5 = this;
-
- // Menu required
- if (!is$1.element(this.elements.settings.panels.quality)) {
- return;
- }
-
- var type = 'quality';
- var list = this.elements.settings.panels.quality.querySelector('[role="menu"]');
-
- // Set options if passed and filter based on uniqueness and config
- if (is$1.array(options)) {
- this.options.quality = dedupe(options).filter(function (quality) {
- return _this5.config.quality.options.includes(quality);
- });
- }
-
- // Toggle the pane and tab
- var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;
- controls.toggleMenuButton.call(this, type, toggle);
-
- // Empty the menu
- emptyElement(list);
-
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
-
- // If we're hiding, nothing more to do
- if (!toggle) {
- return;
- }
-
- // Get the badge HTML for HD, 4K etc
- var getBadge = function getBadge(quality) {
- var label = i18n.get('qualityBadge.' + quality, _this5.config);
-
- if (!label.length) {
- return null;
- }
-
- return controls.createBadge.call(_this5, label);
- };
-
- // Sort options by the config and then render options
- this.options.quality.sort(function (a, b) {
- var sorting = _this5.config.quality.options;
- return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
- }).forEach(function (quality) {
- controls.createMenuItem.call(_this5, {
- value: quality,
- list: list,
- type: type,
- title: controls.getLabel.call(_this5, 'quality', quality),
- badge: getBadge(quality)
- });
- });
-
- controls.updateSetting.call(this, type, list);
- },
-
-
- // Set the looping options
- /* setLoopMenu() {
- // Menu required
- if (!is.element(this.elements.settings.panels.loop)) {
- return;
- }
- const options = ['start', 'end', 'all', 'reset'];
- const list = this.elements.settings.panels.loop.querySelector('[role="menu"]');
- // Show the pane and tab
- toggleHidden(this.elements.settings.buttons.loop, false);
- toggleHidden(this.elements.settings.panels.loop, false);
- // Toggle the pane and tab
- const toggle = !is.empty(this.loop.options);
- controls.toggleMenuButton.call(this, 'loop', toggle);
- // Empty the menu
- emptyElement(list);
- options.forEach(option => {
- const item = createElement('li');
- const button = createElement(
- 'button',
- extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
- type: 'button',
- class: this.config.classNames.control,
- 'data-plyr-loop-action': option,
- }),
- i18n.get(option, this.config)
- );
- if (['start', 'end'].includes(option)) {
- const badge = controls.createBadge.call(this, '00:00');
- button.appendChild(badge);
- }
- item.appendChild(button);
- list.appendChild(item);
- });
- }, */
-
- // Get current selected caption language
- // TODO: rework this to user the getter in the API?
-
- // Set a list of available captions languages
- setCaptionsMenu: function setCaptionsMenu() {
- var _this6 = this;
-
- // Menu required
- if (!is$1.element(this.elements.settings.panels.captions)) {
- return;
- }
-
- // TODO: Captions or language? Currently it's mixed
- var type = 'captions';
- var list = this.elements.settings.panels.captions.querySelector('[role="menu"]');
- var tracks = captions.getTracks.call(this);
- var toggle = Boolean(tracks.length);
-
- // Toggle the pane and tab
- controls.toggleMenuButton.call(this, type, toggle);
-
- // Empty the menu
- emptyElement(list);
-
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
-
- // If there's no captions, bail
- if (!toggle) {
- return;
- }
-
- // Generate options data
- var options = tracks.map(function (track, value) {
- return {
- value: value,
- checked: _this6.captions.toggled && _this6.currentTrack === value,
- title: captions.getLabel.call(_this6, track),
- badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()),
- list: list,
- type: 'language'
- };
- });
-
- // Add the "Disabled" option to turn off captions
- options.unshift({
- value: -1,
- checked: !this.captions.toggled,
- title: i18n.get('disabled', this.config),
- list: list,
- type: 'language'
- });
-
- // Generate options
- options.forEach(controls.createMenuItem.bind(this));
-
- controls.updateSetting.call(this, type, list);
- },
-
-
- // Set a list of available captions languages
- setSpeedMenu: function setSpeedMenu(options) {
- var _this7 = this;
-
- // Menu required
- if (!is$1.element(this.elements.settings.panels.speed)) {
- return;
- }
-
- var type = 'speed';
- var list = this.elements.settings.panels.speed.querySelector('[role="menu"]');
-
- // Set the speed options
- if (is$1.array(options)) {
- this.options.speed = options;
- } else if (this.isHTML5 || this.isVimeo) {
- this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
- }
-
- // Set options if passed and filter based on config
- this.options.speed = this.options.speed.filter(function (speed) {
- return _this7.config.speed.options.includes(speed);
- });
-
- // Toggle the pane and tab
- var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;
- controls.toggleMenuButton.call(this, type, toggle);
-
- // Empty the menu
- emptyElement(list);
-
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
-
- // If we're hiding, nothing more to do
- if (!toggle) {
- return;
- }
-
- // Create items
- this.options.speed.forEach(function (speed) {
- controls.createMenuItem.call(_this7, {
- value: speed,
- list: list,
- type: type,
- title: controls.getLabel.call(_this7, 'speed', speed)
- });
- });
-
- controls.updateSetting.call(this, type, list);
- },
-
-
- // Check if we need to hide/show the settings menu
- checkMenu: function checkMenu() {
- var buttons = this.elements.settings.buttons;
-
- var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {
- return !button.hidden;
- });
+ this.fullscreen = {
+ active: false
+ }; // Options
- toggleHidden(this.elements.settings.menu, !visible);
- },
-
-
- // Focus the first menu item in a given (or visible) menu
- focusFirstMenuItem: function focusFirstMenuItem(pane) {
- var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- if (this.elements.settings.popup.hidden) {
- return;
- }
-
- var target = pane;
+ this.options = {
+ speed: [],
+ quality: []
+ }; // Debugging
+ // TODO: move to globals
- if (!is$1.element(target)) {
- target = Object.values(this.elements.settings.panels).find(function (pane) {
- return !pane.hidden;
- });
- }
+ this.debug = new Console(this.config.debug); // Log config options and support
- var firstItem = target.querySelector('[role^="menuitem"]');
+ this.debug.log('Config', this.config);
+ this.debug.log('Support', support); // We need an element to setup
- setFocus.call(this, firstItem, tabFocus);
- },
+ if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {
+ this.debug.error('Setup failed: no suitable element passed');
+ return;
+ } // Bail if the element is initialized
- // Show/hide menu
- toggleMenu: function toggleMenu(input) {
- var popup = this.elements.settings.popup;
+ if (this.media.plyr) {
+ this.debug.warn('Target already setup');
+ return;
+ } // Bail if not enabled
- var button = this.elements.buttons.settings;
- // Menu and button are required
- if (!is$1.element(popup) || !is$1.element(button)) {
- return;
- }
+ if (!this.config.enabled) {
+ this.debug.error('Setup failed: disabled by config');
+ return;
+ } // Bail if disabled or no basic support
+ // You may want to disable certain UAs etc
- // True toggle by default
- var hidden = popup.hidden;
- var show = hidden;
+ if (!support.check().api) {
+ this.debug.error('Setup failed: no support');
+ return;
+ } // Cache original element state for .destroy()
- if (is$1.boolean(input)) {
- show = input;
- } else if (is$1.keyboardEvent(input) && input.which === 27) {
- show = false;
- } else if (is$1.event(input)) {
- var isMenuItem = popup.contains(input.target);
- // If the click was inside the menu or if the click
- // wasn't the button or menu item and we're trying to
- // show the menu (a doc click shouldn't show the menu)
- if (isMenuItem || !isMenuItem && input.target !== button && show) {
- return;
- }
- }
+ var clone = this.media.cloneNode(true);
+ clone.autoplay = false;
+ this.elements.original = clone; // Set media type based on tag or data attribute
+ // Supported: video, audio, vimeo, youtube
- // Set button attributes
- button.setAttribute('aria-expanded', show);
+ var type = this.media.tagName.toLowerCase(); // Embed properties
- // Show the actual popup
- toggleHidden(popup, !show);
+ var iframe = null;
+ var url = null; // Different setup based on type
- // Add class hook
- toggleClass(this.elements.container, this.config.classNames.menu.open, show);
+ switch (type) {
+ case 'div':
+ // Find the frame
+ iframe = this.media.querySelector('iframe'); // <iframe> type
- // Focus the first item if key interaction
- if (show && is$1.keyboardEvent(input)) {
- controls.focusFirstMenuItem.call(this, null, true);
- } else if (!show && !hidden) {
- // If closing, re-focus the button
- setFocus.call(this, button, is$1.keyboardEvent(input));
- }
- },
+ if (is$1.element(iframe)) {
+ // Detect provider
+ url = parseUrl(iframe.getAttribute('src'));
+ this.provider = getProviderByUrl(url.toString()); // Rework elements
+ this.elements.container = this.media;
+ this.media = iframe; // Reset classname
- // Get the natural size of a menu panel
- getMenuSize: function getMenuSize(tab) {
- var clone = tab.cloneNode(true);
- clone.style.position = 'absolute';
- clone.style.opacity = 0;
- clone.removeAttribute('hidden');
+ this.elements.container.className = ''; // Get attributes from URL and set config
- // Append to parent so we get the "real" size
- tab.parentNode.appendChild(clone);
+ if (url.search.length) {
+ var truthy = ['1', 'true'];
- // Get the sizes before we remove
- var width = clone.scrollWidth;
- var height = clone.scrollHeight;
+ if (truthy.includes(url.searchParams.get('autoplay'))) {
+ this.config.autoplay = true;
+ }
- // Remove from the DOM
- removeElement(clone);
+ if (truthy.includes(url.searchParams.get('loop'))) {
+ this.config.loop.active = true;
+ } // TODO: replace fullscreen.iosNative with this playsinline config option
+ // YouTube requires the playsinline in the URL
- return {
- width: width,
- height: height
- };
- },
+ if (this.isYouTube) {
+ this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
+ this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?
+ } else {
+ this.config.playsinline = true;
+ }
+ }
+ } else {
+ // <div> with attributes
+ this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute
- // Show a panel in the menu
- showMenuPanel: function showMenuPanel() {
- var _this8 = this;
+ this.media.removeAttribute(this.config.attributes.embed.provider);
+ } // Unsupported or missing provider
- var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var target = document.getElementById('plyr-settings-' + this.id + '-' + type);
+ if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ this.debug.error('Setup failed: Invalid provider');
+ return;
+ } // Audio will come later for external providers
- // Nothing to show, bail
- if (!is$1.element(target)) {
- return;
- }
- // Hide all other panels
- var container = target.parentNode;
- var current = Array.from(container.children).find(function (node) {
- return !node.hidden;
- });
+ this.type = types.video;
+ break;
- // If we can do fancy animations, we'll animate the height/width
- if (support.transitions && !support.reducedMotion) {
- // Set the current width as a base
- container.style.width = current.scrollWidth + 'px';
- container.style.height = current.scrollHeight + 'px';
-
- // Get potential sizes
- var size = controls.getMenuSize.call(this, target);
-
- // Restore auto height/width
- var restore = function restore(event) {
- // We're only bothered about height and width on the container
- if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {
- return;
- }
-
- // Revert back to auto
- container.style.width = '';
- container.style.height = '';
-
- // Only listen once
- off.call(_this8, container, transitionEndEvent, restore);
- };
-
- // Listen for the transition finishing and restore auto height/width
- on.call(this, container, transitionEndEvent, restore);
-
- // Set dimensions to target
- container.style.width = size.width + 'px';
- container.style.height = size.height + 'px';
- }
-
- // Set attributes on current tab
- toggleHidden(current, true);
-
- // Set attributes on target
- toggleHidden(target, false);
-
- // Focus the first item
- controls.focusFirstMenuItem.call(this, target, tabFocus);
- },
-
-
- // Build the default HTML
- // TODO: Set order based on order in the config.controls array?
- create: function create(data) {
- var _this9 = this;
-
- // Create the container
- var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));
-
- // Restart button
- if (this.config.controls.includes('restart')) {
- container.appendChild(controls.createButton.call(this, 'restart'));
- }
-
- // Rewind button
- if (this.config.controls.includes('rewind')) {
- container.appendChild(controls.createButton.call(this, 'rewind'));
- }
-
- // Play/Pause button
- if (this.config.controls.includes('play')) {
- container.appendChild(controls.createButton.call(this, 'play'));
- }
-
- // Fast forward button
- if (this.config.controls.includes('fast-forward')) {
- container.appendChild(controls.createButton.call(this, 'fast-forward'));
- }
-
- // Progress
- if (this.config.controls.includes('progress')) {
- var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));
-
- // Seek range slider
- progress.appendChild(controls.createRange.call(this, 'seek', {
- id: 'plyr-seek-' + data.id
- }));
-
- // Buffer progress
- progress.appendChild(controls.createProgress.call(this, 'buffer'));
-
- // TODO: Add loop display indicator
-
- // Seek tooltip
- if (this.config.tooltips.seek) {
- var tooltip = createElement('span', {
- class: this.config.classNames.tooltip
- }, '00:00');
-
- progress.appendChild(tooltip);
- this.elements.display.seekTooltip = tooltip;
- }
-
- this.elements.progress = progress;
- container.appendChild(this.elements.progress);
- }
-
- // Media current time display
- if (this.config.controls.includes('current-time')) {
- container.appendChild(controls.createTime.call(this, 'currentTime'));
- }
-
- // Media duration display
- if (this.config.controls.includes('duration')) {
- container.appendChild(controls.createTime.call(this, 'duration'));
- }
-
- // Volume controls
- if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {
- var volume = createElement('div', {
- class: 'plyr__volume'
- });
-
- // Toggle mute button
- if (this.config.controls.includes('mute')) {
- volume.appendChild(controls.createButton.call(this, 'mute'));
- }
-
- // Volume range control
- if (this.config.controls.includes('volume')) {
- // Set the attributes
- var attributes = {
- max: 1,
- step: 0.05,
- value: this.config.volume
- };
-
- // Create the volume range slider
- volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {
- id: 'plyr-volume-' + data.id
- })));
-
- this.elements.volume = volume;
- }
-
- container.appendChild(volume);
- }
-
- // Toggle captions button
- if (this.config.controls.includes('captions')) {
- container.appendChild(controls.createButton.call(this, 'captions'));
- }
-
- // Settings button / menu
- if (this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {
- var control = createElement('div', {
- class: 'plyr__menu',
- hidden: ''
- });
-
- control.appendChild(controls.createButton.call(this, 'settings', {
- 'aria-haspopup': true,
- 'aria-controls': 'plyr-settings-' + data.id,
- 'aria-expanded': false
- }));
-
- var popup = createElement('div', {
- class: 'plyr__menu__container',
- id: 'plyr-settings-' + data.id,
- hidden: ''
- });
-
- var inner = createElement('div');
-
- var home = createElement('div', {
- id: 'plyr-settings-' + data.id + '-home'
- });
-
- // Create the menu
- var menu = createElement('div', {
- role: 'menu'
- });
-
- home.appendChild(menu);
- inner.appendChild(home);
- this.elements.settings.panels.home = home;
-
- // Build the menu items
- this.config.settings.forEach(function (type) {
- // TODO: bundle this with the createMenuItem helper and bindings
- var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), {
- type: 'button',
- class: _this9.config.classNames.control + ' ' + _this9.config.classNames.control + '--forward',
- role: 'menuitem',
- 'aria-haspopup': true,
- hidden: ''
- }));
-
- // Bind menu shortcuts for keyboard users
- controls.bindMenuItemShortcuts.call(_this9, menuItem, type);
-
- // Show menu on click
- on(menuItem, 'click', function () {
- controls.showMenuPanel.call(_this9, type, false);
- });
-
- var flex = createElement('span', null, i18n.get(type, _this9.config));
-
- var value = createElement('span', {
- class: _this9.config.classNames.menu.value
- });
-
- // Speed contains HTML entities
- value.innerHTML = data[type];
-
- flex.appendChild(value);
- menuItem.appendChild(flex);
- menu.appendChild(menuItem);
-
- // Build the panes
- var pane = createElement('div', {
- id: 'plyr-settings-' + data.id + '-' + type,
- hidden: ''
- });
-
- // Back button
- var backButton = createElement('button', {
- type: 'button',
- class: _this9.config.classNames.control + ' ' + _this9.config.classNames.control + '--back'
- });
-
- // Visible label
- backButton.appendChild(createElement('span', {
- 'aria-hidden': true
- }, i18n.get(type, _this9.config)));
-
- // Screen reader label
- backButton.appendChild(createElement('span', {
- class: _this9.config.classNames.hidden
- }, i18n.get('menuBack', _this9.config)));
-
- // Go back via keyboard
- on(pane, 'keydown', function (event) {
- // We only care about <-
- if (event.which !== 37) {
- return;
- }
-
- // Prevent seek
- event.preventDefault();
- event.stopPropagation();
-
- // Show the respective menu
- controls.showMenuPanel.call(_this9, 'home', true);
- }, false);
-
- // Go back via button click
- on(backButton, 'click', function () {
- controls.showMenuPanel.call(_this9, 'home', false);
- });
-
- // Add to pane
- pane.appendChild(backButton);
-
- // Menu
- pane.appendChild(createElement('div', {
- role: 'menu'
- }));
-
- inner.appendChild(pane);
-
- _this9.elements.settings.buttons[type] = menuItem;
- _this9.elements.settings.panels[type] = pane;
- });
-
- popup.appendChild(inner);
- control.appendChild(popup);
- container.appendChild(control);
-
- this.elements.settings.popup = popup;
- this.elements.settings.menu = control;
- }
-
- // Picture in picture button
- if (this.config.controls.includes('pip') && support.pip) {
- container.appendChild(controls.createButton.call(this, 'pip'));
- }
-
- // Airplay button
- if (this.config.controls.includes('airplay') && support.airplay) {
- container.appendChild(controls.createButton.call(this, 'airplay'));
- }
-
- // Toggle fullscreen button
- if (this.config.controls.includes('fullscreen')) {
- container.appendChild(controls.createButton.call(this, 'fullscreen'));
- }
-
- // Larger overlaid play button
- if (this.config.controls.includes('play-large')) {
- this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));
- }
-
- this.elements.controls = container;
-
- // Set available quality levels
- if (this.isHTML5) {
- controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));
- }
-
- controls.setSpeedMenu.call(this);
-
- return container;
- },
-
-
- // Insert controls
- inject: function inject() {
- var _this10 = this;
-
- // Sprite
- if (this.config.loadSprite) {
- var icon = controls.getIconUrl.call(this);
-
- // Only load external sprite using AJAX
- if (icon.cors) {
- loadSprite(icon.url, 'sprite-plyr');
- }
- }
-
- // Create a unique ID
- this.id = Math.floor(Math.random() * 10000);
-
- // Null by default
- var container = null;
- this.elements.controls = null;
-
- // Set template properties
- var props = {
- id: this.id,
- seektime: this.config.seekTime,
- title: this.config.title
- };
- var update = true;
-
- // If function, run it and use output
- if (is$1.function(this.config.controls)) {
- this.config.controls = this.config.controls.call(this.props);
- }
-
- // Convert falsy controls to empty array (primarily for empty strings)
- if (!this.config.controls) {
- this.config.controls = [];
- }
-
- if (is$1.element(this.config.controls) || is$1.string(this.config.controls)) {
- // HTMLElement or Non-empty string passed as the option
- container = this.config.controls;
- } else {
- // Create controls
- container = controls.create.call(this, {
- id: this.id,
- seektime: this.config.seekTime,
- speed: this.speed,
- quality: this.quality,
- captions: captions.getLabel.call(this)
- // TODO: Looping
- // loop: 'None',
- });
- update = false;
- }
-
- // Replace props with their value
- var replace = function replace(input) {
- var result = input;
-
- Object.entries(props).forEach(function (_ref2) {
- var _ref3 = slicedToArray(_ref2, 2),
- key = _ref3[0],
- value = _ref3[1];
-
- result = replaceAll(result, '{' + key + '}', value);
- });
-
- return result;
- };
-
- // Update markup
- if (update) {
- if (is$1.string(this.config.controls)) {
- container = replace(container);
- } else if (is$1.element(container)) {
- container.innerHTML = replace(container.innerHTML);
- }
- }
-
- // Controls container
- var target = void 0;
-
- // Inject to custom location
- if (is$1.string(this.config.selectors.controls.container)) {
- target = document.querySelector(this.config.selectors.controls.container);
- }
-
- // Inject into the container by default
- if (!is$1.element(target)) {
- target = this.elements.container;
- }
-
- // Inject controls HTML (needs to be before captions, hence "afterbegin")
- var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';
- target[insertMethod]('afterbegin', container);
-
- // Find the elements if need be
- if (!is$1.element(this.elements.controls)) {
- controls.findElements.call(this);
- }
-
- // Add pressed property to buttons
- if (!is$1.empty(this.elements.buttons)) {
- var addProperty = function addProperty(button) {
- var className = _this10.config.classNames.controlPressed;
- Object.defineProperty(button, 'pressed', {
- enumerable: true,
- get: function get() {
- return hasClass(button, className);
- },
- set: function set() {
- var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- toggleClass(button, className, pressed);
- }
- });
- };
-
- // Toggle classname when pressed property is set
- Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {
- if (is$1.array(button) || is$1.nodeList(button)) {
- Array.from(button).filter(Boolean).forEach(addProperty);
- } else {
- addProperty(button);
- }
- });
- }
-
- // Edge sometimes doesn't finish the paint so force a redraw
- if (window.navigator.userAgent.includes('Edge')) {
- repaint(target);
- }
-
- // Setup tooltips
- if (this.config.tooltips.controls) {
- var _config = this.config,
- classNames = _config.classNames,
- selectors = _config.selectors;
-
- var selector = selectors.controls.wrapper + ' ' + selectors.labels + ' .' + classNames.hidden;
- var labels = getElements.call(this, selector);
-
- Array.from(labels).forEach(function (label) {
- toggleClass(label, _this10.config.classNames.hidden, false);
- toggleClass(label, _this10.config.classNames.tooltip, true);
- });
- }
- }
- };
-
- // ==========================================================================
-
- /**
- * Parse a string to a URL object
- * @param {string} input - the URL to be parsed
- * @param {boolean} safe - failsafe parsing
- */
- function parseUrl(input) {
- var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
-
- var url = input;
-
- if (safe) {
- var parser = document.createElement('a');
- parser.href = url;
- url = parser.href;
- }
-
- try {
- return new URL(url);
- } catch (e) {
- return null;
- }
- }
-
- // Convert object to URLSearchParams
- function buildUrlParams(input) {
- var params = new URLSearchParams();
-
- if (is$1.object(input)) {
- Object.entries(input).forEach(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- key = _ref2[0],
- value = _ref2[1];
-
- params.set(key, value);
- });
- }
-
- return params;
- }
-
- // ==========================================================================
-
- var captions = {
- // Setup captions
- setup: function setup() {
- // Requires UI support
- if (!this.supported.ui) {
- return;
- }
-
- // Only Vimeo and HTML5 video supported at this point
- if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
- // Clear menu and hide
- if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
- controls.setCaptionsMenu.call(this);
- }
-
- return;
- }
-
- // Inject the container
- if (!is$1.element(this.elements.captions)) {
- this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
-
- insertAfter(this.elements.captions, this.elements.wrapper);
- }
-
- // Fix IE captions if CORS is used
- // Fetch captions and inject as blobs instead (data URIs not supported!)
- if (browser.isIE && window.URL) {
- var elements = this.media.querySelectorAll('track');
-
- Array.from(elements).forEach(function (track) {
- var src = track.getAttribute('src');
- var url = parseUrl(src);
-
- if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
- fetch(src, 'blob').then(function (blob) {
- track.setAttribute('src', window.URL.createObjectURL(blob));
- }).catch(function () {
- removeElement(track);
- });
- }
- });
- }
-
- // Get and set initial data
- // The "preferred" options are not realized unless / until the wanted language has a match
- // * languages: Array of user's browser languages.
- // * language: The language preferred by user settings or config
- // * active: The state preferred by user settings or config
- // * toggled: The real captions state
-
- var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];
- var languages = dedupe(browserLanguages.map(function (language) {
- return language.split('-')[0];
- }));
-
- var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();
-
- // Use first browser language when language is 'auto'
- if (language === 'auto') {
- var _languages = slicedToArray(languages, 1);
-
- language = _languages[0];
- }
-
- var active = this.storage.get('captions');
- if (!is$1.boolean(active)) {
- active = this.config.captions.active;
- }
-
- Object.assign(this.captions, {
- toggled: false,
- active: active,
- language: language,
- languages: languages
- });
-
- // Watch changes to textTracks and update captions menu
- if (this.isHTML5) {
- var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
- on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
- }
-
- // Update available languages in list next tick (the event must not be triggered before the listeners)
- setTimeout(captions.update.bind(this), 0);
- },
-
-
- // Update available language options in settings based on tracks
- update: function update() {
- var _this = this;
-
- var tracks = captions.getTracks.call(this, true);
- // Get the wanted language
- var _captions = this.captions,
- active = _captions.active,
- language = _captions.language,
- meta = _captions.meta,
- currentTrackNode = _captions.currentTrackNode;
-
- var languageExists = Boolean(tracks.find(function (track) {
- return track.language === language;
- }));
-
- // Handle tracks (add event listener and "pseudo"-default)
- if (this.isHTML5 && this.isVideo) {
- tracks.filter(function (track) {
- return !meta.get(track);
- }).forEach(function (track) {
- _this.debug.log('Track added', track);
- // Attempt to store if the original dom element was "default"
- meta.set(track, {
- default: track.mode === 'showing'
- });
-
- // Turn off native caption rendering to avoid double captions
- track.mode = 'hidden';
-
- // Add event listener for cue changes
- on.call(_this, track, 'cuechange', function () {
- return captions.updateCues.call(_this);
- });
- });
- }
-
- // Update language first time it matches, or if the previous matching track was removed
- if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {
- captions.setLanguage.call(this, language);
- captions.toggle.call(this, active && languageExists);
- }
-
- // Enable or disable captions based on track length
- toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks));
-
- // Update available languages in list
- if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
- controls.setCaptionsMenu.call(this);
- }
- },
-
-
- // Toggle captions display
- // Used internally for the toggleCaptions method, with the passive option forced to false
- toggle: function toggle(input) {
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
-
- // If there's no full support
- if (!this.supported.ui) {
- return;
- }
-
- var toggled = this.captions.toggled; // Current state
-
- var activeClass = this.config.classNames.captions.active;
-
- // Get the next state
- // If the method is called without parameter, toggle based on current value
- var active = is$1.nullOrUndefined(input) ? !toggled : input;
-
- // Update state and trigger event
- if (active !== toggled) {
- // When passive, don't override user preferences
- if (!passive) {
- this.captions.active = active;
- this.storage.set({ captions: active });
- }
-
- // Force language if the call isn't passive and there is no matching language to toggle to
- if (!this.language && active && !passive) {
- var tracks = captions.getTracks.call(this);
- var track = captions.findTrack.call(this, [this.captions.language].concat(toConsumableArray(this.captions.languages)), true);
-
- // Override user preferences to avoid switching languages if a matching track is added
- this.captions.language = track.language;
-
- // Set caption, but don't store in localStorage as user preference
- captions.set.call(this, tracks.indexOf(track));
- return;
- }
-
- // Toggle button if it's enabled
- if (this.elements.buttons.captions) {
- this.elements.buttons.captions.pressed = active;
- }
-
- // Add class hook
- toggleClass(this.elements.container, activeClass, active);
-
- this.captions.toggled = active;
-
- // Update settings menu
- controls.updateSetting.call(this, 'captions');
-
- // Trigger event (not used internally)
- triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
- }
- },
-
-
- // Set captions by track index
- // Used internally for the currentTrack setter with the passive option forced to false
- set: function set(index) {
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
-
- var tracks = captions.getTracks.call(this);
-
- // Disable captions if setting to -1
- if (index === -1) {
- captions.toggle.call(this, false, passive);
- return;
- }
-
- if (!is$1.number(index)) {
- this.debug.warn('Invalid caption argument', index);
- return;
- }
-
- if (!(index in tracks)) {
- this.debug.warn('Track not found', index);
- return;
- }
-
- if (this.captions.currentTrack !== index) {
- this.captions.currentTrack = index;
- var track = tracks[index];
-
- var _ref = track || {},
- language = _ref.language;
-
- // Store reference to node for invalidation on remove
-
-
- this.captions.currentTrackNode = track;
-
- // Update settings menu
- controls.updateSetting.call(this, 'captions');
-
- // When passive, don't override user preferences
- if (!passive) {
- this.captions.language = language;
- this.storage.set({ language: language });
- }
-
- // Handle Vimeo captions
- if (this.isVimeo) {
- this.embed.enableTextTrack(language);
- }
-
- // Trigger event
- triggerEvent.call(this, this.media, 'languagechange');
- }
-
- // Show captions
- captions.toggle.call(this, true, passive);
-
- if (this.isHTML5 && this.isVideo) {
- // If we change the active track while a cue is already displayed we need to update it
- captions.updateCues.call(this);
- }
- },
-
-
- // Set captions by language
- // Used internally for the language setter with the passive option forced to false
- setLanguage: function setLanguage(input) {
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
-
- if (!is$1.string(input)) {
- this.debug.warn('Invalid language argument', input);
- return;
- }
- // Normalize
- var language = input.toLowerCase();
- this.captions.language = language;
-
- // Set currentTrack
- var tracks = captions.getTracks.call(this);
- var track = captions.findTrack.call(this, [language]);
- captions.set.call(this, tracks.indexOf(track), passive);
- },
-
-
- // Get current valid caption tracks
- // If update is false it will also ignore tracks without metadata
- // This is used to "freeze" the language options when captions.update is false
- getTracks: function getTracks() {
- var _this2 = this;
-
- var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- // Handle media or textTracks missing or null
- var tracks = Array.from((this.media || {}).textTracks || []);
- // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
- // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
- return tracks.filter(function (track) {
- return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
- }).filter(function (track) {
- return ['captions', 'subtitles'].includes(track.kind);
- });
- },
-
-
- // Match tracks based on languages and get the first
- findTrack: function findTrack(languages) {
- var _this3 = this;
-
- var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- var tracks = captions.getTracks.call(this);
- var sortIsDefault = function sortIsDefault(track) {
- return Number((_this3.captions.meta.get(track) || {}).default);
- };
- var sorted = Array.from(tracks).sort(function (a, b) {
- return sortIsDefault(b) - sortIsDefault(a);
- });
- var track = void 0;
- languages.every(function (language) {
- track = sorted.find(function (track) {
- return track.language === language;
- });
- return !track; // Break iteration if there is a match
- });
- // If no match is found but is required, get first
- return track || (force ? sorted[0] : undefined);
- },
-
-
- // Get the current track
- getCurrentTrack: function getCurrentTrack() {
- return captions.getTracks.call(this)[this.currentTrack];
- },
-
-
- // Get UI label for track
- getLabel: function getLabel(track) {
- var currentTrack = track;
-
- if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {
- currentTrack = captions.getCurrentTrack.call(this);
- }
-
- if (is$1.track(currentTrack)) {
- if (!is$1.empty(currentTrack.label)) {
- return currentTrack.label;
- }
-
- if (!is$1.empty(currentTrack.language)) {
- return track.language.toUpperCase();
- }
-
- return i18n.get('enabled', this.config);
- }
-
- return i18n.get('disabled', this.config);
- },
-
-
- // Update captions using current track's active cues
- // Also optional array argument in case there isn't any track (ex: vimeo)
- updateCues: function updateCues(input) {
- // Requires UI
- if (!this.supported.ui) {
- return;
- }
-
- if (!is$1.element(this.elements.captions)) {
- this.debug.warn('No captions element to render to');
- return;
- }
-
- // Only accept array or empty input
- if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {
- this.debug.warn('updateCues: Invalid input', input);
- return;
- }
-
- var cues = input;
-
- // Get cues from track
- if (!cues) {
- var track = captions.getCurrentTrack.call(this);
- cues = Array.from((track || {}).activeCues || []).map(function (cue) {
- return cue.getCueAsHTML();
- }).map(getHTML);
- }
-
- // Set new caption text
- var content = cues.map(function (cueText) {
- return cueText.trim();
- }).join('\n');
- var changed = content !== this.elements.captions.innerHTML;
-
- if (changed) {
- // Empty the container and create a new child element
- emptyElement(this.elements.captions);
- var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
- caption.innerHTML = content;
- this.elements.captions.appendChild(caption);
-
- // Trigger event
- triggerEvent.call(this, this.media, 'cuechange');
- }
- }
- };
-
- // ==========================================================================
- // Plyr default config
- // ==========================================================================
-
- var defaults$1 = {
- // Disable
- enabled: true,
-
- // Custom media title
- title: '',
-
- // Logging to console
- debug: false,
-
- // Auto play (if supported)
- autoplay: false,
-
- // Only allow one media playing at once (vimeo only)
- autopause: true,
-
- // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
- // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
- playsinline: true,
-
- // Default time to skip when rewind/fast forward
- seekTime: 10,
-
- // Default volume
- volume: 1,
- muted: false,
-
- // Pass a custom duration
- duration: null,
-
- // Display the media duration on load in the current time position
- // If you have opted to display both duration and currentTime, this is ignored
- displayDuration: true,
-
- // Invert the current time to be a countdown
- invertTime: true,
-
- // Clicking the currentTime inverts it's value to show time left rather than elapsed
- toggleInvert: true,
-
- // Aspect ratio (for embeds)
- ratio: '16:9',
-
- // Click video container to play/pause
- clickToPlay: true,
-
- // Auto hide the controls
- hideControls: true,
-
- // Reset to start when playback ended
- resetOnEnd: false,
-
- // Disable the standard context menu
- disableContextMenu: true,
-
- // Sprite (for icons)
- loadSprite: true,
- iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',
-
- // Blank video (used to prevent errors on source change)
- blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
-
- // Quality default
- quality: {
- default: 576,
- options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]
- },
-
- // Set loops
- loop: {
- active: false
- // start: null,
- // end: null,
- },
-
- // Speed default and options to display
- speed: {
- selected: 1,
- options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
- },
-
- // Keyboard shortcut settings
- keyboard: {
- focused: true,
- global: false
- },
-
- // Display tooltips
- tooltips: {
- controls: false,
- seek: true
- },
-
- // Captions settings
- captions: {
- active: false,
- language: 'auto',
- // Listen to new tracks added after Plyr is initialized.
- // This is needed for streaming captions, but may result in unselectable options
- update: false
- },
-
- // Fullscreen settings
- fullscreen: {
- enabled: true, // Allow fullscreen?
- fallback: true, // Fallback for vintage browsers
- iosNative: false // Use the native fullscreen in iOS (disables custom controls)
- },
-
- // Local storage
- storage: {
- enabled: true,
- key: 'plyr'
- },
-
- // Default controls
- controls: ['play-large',
- // 'restart',
- // 'rewind',
- 'play',
- // 'fast-forward',
- 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
- settings: ['captions', 'quality', 'speed'],
-
- // Localisation
- i18n: {
- restart: 'Restart',
- rewind: 'Rewind {seektime}s',
- play: 'Play',
- pause: 'Pause',
- fastForward: 'Forward {seektime}s',
- seek: 'Seek',
- seekLabel: '{currentTime} of {duration}',
- played: 'Played',
- buffered: 'Buffered',
- currentTime: 'Current time',
- duration: 'Duration',
- volume: 'Volume',
- mute: 'Mute',
- unmute: 'Unmute',
- enableCaptions: 'Enable captions',
- disableCaptions: 'Disable captions',
- enterFullscreen: 'Enter fullscreen',
- exitFullscreen: 'Exit fullscreen',
- frameTitle: 'Player for {title}',
- captions: 'Captions',
- settings: 'Settings',
- menuBack: 'Go back to previous menu',
- speed: 'Speed',
- normal: 'Normal',
- quality: 'Quality',
- loop: 'Loop',
- start: 'Start',
- end: 'End',
- all: 'All',
- reset: 'Reset',
- disabled: 'Disabled',
- enabled: 'Enabled',
- advertisement: 'Ad',
- qualityBadge: {
- 2160: '4K',
- 1440: 'HD',
- 1080: 'HD',
- 720: 'HD',
- 576: 'SD',
- 480: 'SD'
- }
- },
-
- // URLs
- urls: {
- vimeo: {
- sdk: 'https://player.vimeo.com/api/player.js',
- iframe: 'https://player.vimeo.com/video/{0}?{1}',
- api: 'https://vimeo.com/api/v2/video/{0}.json'
- },
- youtube: {
- sdk: 'https://www.youtube.com/iframe_api',
- api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'
- },
- googleIMA: {
- sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
- }
- },
-
- // Custom control listeners
- listeners: {
- seek: null,
- play: null,
- pause: null,
- restart: null,
- rewind: null,
- fastForward: null,
- mute: null,
- volume: null,
- captions: null,
- fullscreen: null,
- pip: null,
- airplay: null,
- speed: null,
- quality: null,
- loop: null,
- language: null
- },
-
- // Events to watch and bubble
- events: [
- // Events to watch on HTML5 media elements and bubble
- // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
- 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',
-
- // Custom events
- 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',
-
- // YouTube
- 'statechange',
-
- // Quality
- 'qualitychange',
-
- // Ads
- 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
-
- // Selectors
- // Change these to match your template if using custom HTML
- selectors: {
- editable: 'input, textarea, select, [contenteditable]',
- container: '.plyr',
- controls: {
- container: null,
- wrapper: '.plyr__controls'
- },
- labels: '[data-plyr]',
- buttons: {
- play: '[data-plyr="play"]',
- pause: '[data-plyr="pause"]',
- restart: '[data-plyr="restart"]',
- rewind: '[data-plyr="rewind"]',
- fastForward: '[data-plyr="fast-forward"]',
- mute: '[data-plyr="mute"]',
- captions: '[data-plyr="captions"]',
- fullscreen: '[data-plyr="fullscreen"]',
- pip: '[data-plyr="pip"]',
- airplay: '[data-plyr="airplay"]',
- settings: '[data-plyr="settings"]',
- loop: '[data-plyr="loop"]'
- },
- inputs: {
- seek: '[data-plyr="seek"]',
- volume: '[data-plyr="volume"]',
- speed: '[data-plyr="speed"]',
- language: '[data-plyr="language"]',
- quality: '[data-plyr="quality"]'
- },
- display: {
- currentTime: '.plyr__time--current',
- duration: '.plyr__time--duration',
- buffer: '.plyr__progress__buffer',
- loop: '.plyr__progress__loop', // Used later
- volume: '.plyr__volume--display'
- },
- progress: '.plyr__progress',
- captions: '.plyr__captions',
- caption: '.plyr__caption',
- menu: {
- quality: '.js-plyr__menu__list--quality'
- }
- },
-
- // Class hooks added to the player in different states
- classNames: {
- type: 'plyr--{0}',
- provider: 'plyr--{0}',
- video: 'plyr__video-wrapper',
- embed: 'plyr__video-embed',
- embedContainer: 'plyr__video-embed__container',
- poster: 'plyr__poster',
- posterEnabled: 'plyr__poster-enabled',
- ads: 'plyr__ads',
- control: 'plyr__control',
- controlPressed: 'plyr__control--pressed',
- playing: 'plyr--playing',
- paused: 'plyr--paused',
- stopped: 'plyr--stopped',
- loading: 'plyr--loading',
- hover: 'plyr--hover',
- tooltip: 'plyr__tooltip',
- cues: 'plyr__cues',
- hidden: 'plyr__sr-only',
- hideControls: 'plyr--hide-controls',
- isIos: 'plyr--is-ios',
- isTouch: 'plyr--is-touch',
- uiSupported: 'plyr--full-ui',
- noTransition: 'plyr--no-transition',
- display: {
- time: 'plyr__time'
- },
- menu: {
- value: 'plyr__menu__value',
- badge: 'plyr__badge',
- open: 'plyr--menu-open'
- },
- captions: {
- enabled: 'plyr--captions-enabled',
- active: 'plyr--captions-active'
- },
- fullscreen: {
- enabled: 'plyr--fullscreen-enabled',
- fallback: 'plyr--fullscreen-fallback'
- },
- pip: {
- supported: 'plyr--pip-supported',
- active: 'plyr--pip-active'
- },
- airplay: {
- supported: 'plyr--airplay-supported',
- active: 'plyr--airplay-active'
- },
- tabFocus: 'plyr__tab-focus'
- },
-
- // Embed attributes
- attributes: {
- embed: {
- provider: 'data-plyr-provider',
- id: 'data-plyr-embed-id'
- }
- },
-
- // API keys
- keys: {
- google: null
- },
-
- // Advertisements plugin
- // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
- ads: {
- enabled: false,
- publisherId: ''
- }
- };
-
- // ==========================================================================
- // Plyr supported types and providers
- // ==========================================================================
-
- var providers = {
- html5: 'html5',
- youtube: 'youtube',
- vimeo: 'vimeo'
- };
-
- var types = {
- audio: 'audio',
- video: 'video'
- };
-
- /**
- * Get provider by URL
- * @param {string} url
- */
- function getProviderByUrl(url) {
- // YouTube
- if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
- return providers.youtube;
- }
-
- // Vimeo
- if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
- return providers.vimeo;
- }
-
- return null;
- }
-
- // ==========================================================================
- // Console wrapper
- // ==========================================================================
-
- var noop = function noop() {};
-
- var Console = function () {
- function Console() {
- var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- classCallCheck(this, Console);
-
- this.enabled = window.console && enabled;
-
- if (this.enabled) {
- this.log('Debugging enabled');
- }
- }
-
- createClass(Console, [{
- key: 'log',
- get: function get() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
- }
- }, {
- key: 'warn',
- get: function get() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
- }
- }, {
- key: 'error',
- get: function get() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
- }
- }]);
- return Console;
- }();
-
- // ==========================================================================
-
- function onChange() {
- if (!this.enabled) {
- return;
- }
-
- // Update toggle button
- var button = this.player.elements.buttons.fullscreen;
- if (is$1.element(button)) {
- button.pressed = this.active;
- }
-
- // Trigger an event
- triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
-
- // Trap focus in container
- if (!browser.isIos) {
- trapFocus.call(this.player, this.target, this.active);
- }
- }
-
- function toggleFallback() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- // Store or restore scroll position
- if (toggle) {
- this.scrollPosition = {
- x: window.scrollX || 0,
- y: window.scrollY || 0
- };
- } else {
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
- }
-
- // Toggle scroll
- document.body.style.overflow = toggle ? 'hidden' : '';
-
- // Toggle class hook
- toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);
-
- // Toggle button and fire events
- onChange.call(this);
- }
-
- var Fullscreen = function () {
- function Fullscreen(player) {
- var _this = this;
-
- classCallCheck(this, Fullscreen);
-
- // Keep reference to parent
- this.player = player;
-
- // Get prefix
- this.prefix = Fullscreen.prefix;
- this.property = Fullscreen.property;
-
- // Scroll position
- this.scrollPosition = { x: 0, y: 0 };
-
- // Register event listeners
- // Handle event (incase user presses escape etc)
- on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () {
- // TODO: Filter for target??
- onChange.call(_this);
- });
-
- // Fullscreen toggle on double click
- on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
- // Ignore double click in controls
- if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
- return;
- }
-
- _this.toggle();
- });
-
- // Update the UI
- this.update();
- }
-
- // Determine if native supported
-
-
- createClass(Fullscreen, [{
- key: 'update',
-
-
- // Update UI
- value: function update() {
- if (this.enabled) {
- this.player.debug.log((Fullscreen.native ? 'Native' : 'Fallback') + ' fullscreen enabled');
- } else {
- this.player.debug.log('Fullscreen not supported and fallback disabled');
- }
-
- // Add styling hook to show button
- toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
- }
-
- // Make an element fullscreen
-
- }, {
- key: 'enter',
- value: function enter() {
- if (!this.enabled) {
- return;
- }
-
- // iOS native fullscreen doesn't need the request step
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitEnterFullscreen();
- } else if (!Fullscreen.native) {
- toggleFallback.call(this, true);
- } else if (!this.prefix) {
- this.target.requestFullscreen();
- } else if (!is$1.empty(this.prefix)) {
- this.target[this.prefix + 'Request' + this.property]();
- }
- }
-
- // Bail from fullscreen
-
- }, {
- key: 'exit',
- value: function exit() {
- if (!this.enabled) {
- return;
- }
-
- // iOS native fullscreen
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitExitFullscreen();
- this.player.play();
- } else if (!Fullscreen.native) {
- toggleFallback.call(this, false);
- } else if (!this.prefix) {
- (document.cancelFullScreen || document.exitFullscreen).call(document);
- } else if (!is$1.empty(this.prefix)) {
- var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
- document['' + this.prefix + action + this.property]();
- }
- }
-
- // Toggle state
-
- }, {
- key: 'toggle',
- value: function toggle() {
- if (!this.active) {
- this.enter();
- } else {
- this.exit();
- }
- }
- }, {
- key: 'enabled',
-
-
- // Determine if fullscreen is enabled
- get: function get() {
- return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
- }
-
- // Get active state
-
- }, {
- key: 'active',
- get: function get() {
- if (!this.enabled) {
- return false;
- }
-
- // Fallback using classname
- if (!Fullscreen.native) {
- return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
- }
-
- var element = !this.prefix ? document.fullscreenElement : document['' + this.prefix + this.property + 'Element'];
-
- return element === this.target;
- }
-
- // Get target element
-
- }, {
- key: 'target',
- get: function get() {
- return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
- }
- }], [{
- key: 'native',
- get: function get() {
- return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
- }
-
- // Get the prefix for handlers
-
- }, {
- key: 'prefix',
- get: function get() {
- // No prefix
- if (is$1.function(document.exitFullscreen)) {
- return '';
- }
-
- // Check for fullscreen support by vendor prefix
- var value = '';
- var prefixes = ['webkit', 'moz', 'ms'];
-
- prefixes.some(function (pre) {
- if (is$1.function(document[pre + 'ExitFullscreen']) || is$1.function(document[pre + 'CancelFullScreen'])) {
- value = pre;
- return true;
- }
-
- return false;
- });
-
- return value;
- }
- }, {
- key: 'property',
- get: function get() {
- return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
- }
- }]);
- return Fullscreen;
- }();
-
- // ==========================================================================
- // Load image avoiding xhr/fetch CORS issues
- // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
- // By default it checks if it is at least 1px, but you can add a second argument to change this
- // ==========================================================================
-
- function loadImage(src) {
- var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
-
- return new Promise(function (resolve, reject) {
- var image = new Image();
-
- var handler = function handler() {
- delete image.onload;
- delete image.onerror;
- (image.naturalWidth >= minWidth ? resolve : reject)(image);
- };
-
- Object.assign(image, { onload: handler, onerror: handler, src: src });
- });
- }
-
- // ==========================================================================
-
- var ui = {
- addStyleHook: function addStyleHook() {
- toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
- toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
- },
+ case 'video':
+ case 'audio':
+ this.type = type;
+ this.provider = providers.html5; // Get config from attributes
+ if (this.media.hasAttribute('crossorigin')) {
+ this.config.crossorigin = true;
+ }
- // Toggle native HTML5 media controls
- toggleNativeControls: function toggleNativeControls() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- if (toggle && this.isHTML5) {
- this.media.setAttribute('controls', '');
- } else {
- this.media.removeAttribute('controls');
- }
- },
+ if (this.media.hasAttribute('autoplay')) {
+ this.config.autoplay = true;
+ }
+ if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {
+ this.config.playsinline = true;
+ }
- // Setup the UI
- build: function build() {
- var _this = this;
+ if (this.media.hasAttribute('muted')) {
+ this.config.muted = true;
+ }
- // Re-attach media element listeners
- // TODO: Use event bubbling?
- this.listeners.media();
-
- // Don't setup interface if no support
- if (!this.supported.ui) {
- this.debug.warn('Basic support only for ' + this.provider + ' ' + this.type);
-
- // Restore native controls
- ui.toggleNativeControls.call(this, true);
-
- // Bail
- return;
- }
-
- // Inject custom controls if not present
- if (!is$1.element(this.elements.controls)) {
- // Inject custom controls
- controls.inject.call(this);
+ if (this.media.hasAttribute('loop')) {
+ this.config.loop.active = true;
+ }
- // Re-attach control listeners
- this.listeners.controls();
- }
+ break;
- // Remove native controls
- ui.toggleNativeControls.call(this);
+ default:
+ this.debug.error('Setup failed: unsupported type');
+ return;
+ } // Check for support again but with type
- // Setup captions for HTML5
- if (this.isHTML5) {
- captions.setup.call(this);
- }
- // Reset volume
- this.volume = null;
+ this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail
- // Reset mute state
- this.muted = null;
+ if (!this.supported.api) {
+ this.debug.error('Setup failed: no support');
+ return;
+ }
- // Reset speed
- this.speed = null;
+ this.eventListeners = []; // Create listeners
- // Reset loop state
- this.loop = null;
+ this.listeners = new Listeners(this); // Setup local storage for user settings
- // Reset quality setting
- this.quality = null;
+ this.storage = new Storage(this); // Store reference
- // Reset volume display
- controls.updateVolume.call(this);
+ this.media.plyr = this; // Wrap media
- // Reset time display
- controls.timeUpdate.call(this);
+ if (!is$1.element(this.elements.container)) {
+ this.elements.container = createElement('div');
+ wrap(this.media, this.elements.container);
+ } // Add style hook
- // Update the UI
- ui.checkPlaying.call(this);
- // Check for picture-in-picture support
- toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);
+ ui.addStyleHook.call(this); // Setup media
- // Check for airplay support
- toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);
+ media.setup.call(this); // Listen for events if debugging
- // Add iOS class
- toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);
+ if (this.config.debug) {
+ on.call(this, this.elements.container, this.config.events.join(' '), function (event) {
+ _this.debug.log("event: ".concat(event.type));
+ });
+ } // Setup interface
+ // If embed but not fully supported, build interface now to avoid flash of controls
- // Add touch class
- toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);
-
- // Ready for API calls
- this.ready = true;
-
- // Ready event at end of execution stack
- setTimeout(function () {
- triggerEvent.call(_this, _this.media, 'ready');
- }, 0);
-
- // Set the title
- ui.setTitle.call(this);
-
- // Assure the poster image is set, if the property was added before the element was created
- if (this.poster) {
- ui.setPoster.call(this, this.poster, false).catch(function () {});
- }
-
- // Manually set the duration if user has overridden it.
- // The event listeners for it doesn't get called if preload is disabled (#701)
- if (this.config.duration) {
- controls.durationUpdate.call(this);
- }
- },
-
-
- // Setup aria attribute for play and iframe title
- setTitle: function setTitle() {
- // Find the current text
- var label = i18n.get('play', this.config);
-
- // If there's a media title set, use that for the label
- if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {
- label += ', ' + this.config.title;
- }
-
- // If there's a play button, set label
- Array.from(this.elements.buttons.play || []).forEach(function (button) {
- button.setAttribute('aria-label', label);
- });
-
- // Set iframe title
- // https://github.com/sampotts/plyr/issues/124
- if (this.isEmbed) {
- var iframe = getElement.call(this, 'iframe');
-
- if (!is$1.element(iframe)) {
- return;
- }
-
- // Default to media type
- var title = !is$1.empty(this.config.title) ? this.config.title : 'video';
- var format = i18n.get('frameTitle', this.config);
- iframe.setAttribute('title', format.replace('{title}', title));
- }
- },
+ if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
+ ui.build.call(this);
+ } // Container listeners
- // Toggle poster
- togglePoster: function togglePoster(enable) {
- toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
- },
-
+ this.listeners.container(); // Global listeners
- // Set the poster image (async)
- // Used internally for the poster setter, with the passive option forced to false
- setPoster: function setPoster(poster) {
- var _this2 = this;
-
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ this.listeners.global(); // Setup fullscreen
- // Don't override if call is passive
- if (passive && this.poster) {
- return Promise.reject(new Error('Poster already set'));
- }
-
- // Set property synchronously to respect the call order
- this.media.setAttribute('poster', poster);
-
- // Wait until ui is ready
- return ready.call(this)
- // Load image
- .then(function () {
- return loadImage(poster);
- }).catch(function (err) {
- // Hide poster on error unless it's been set by another call
- if (poster === _this2.poster) {
- ui.togglePoster.call(_this2, false);
- }
- // Rethrow
- throw err;
- }).then(function () {
- // Prevent race conditions
- if (poster !== _this2.poster) {
- throw new Error('setPoster cancelled by later call to setPoster');
- }
- }).then(function () {
- Object.assign(_this2.elements.poster.style, {
- backgroundImage: 'url(\'' + poster + '\')',
- // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
- backgroundSize: ''
- });
- ui.togglePoster.call(_this2, true);
- return poster;
- });
- },
-
-
- // Check playing state
- checkPlaying: function checkPlaying(event) {
- var _this3 = this;
-
- // Class hooks
- toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
- toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
- toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);
-
- // Set state
- Array.from(this.elements.buttons.play || []).forEach(function (target) {
- target.pressed = _this3.playing;
- });
-
- // Only update controls on non timeupdate events
- if (is$1.event(event) && event.type === 'timeupdate') {
- return;
- }
-
- // Toggle controls
- ui.toggleControls.call(this);
- },
-
-
- // Check if media is loading
- checkLoading: function checkLoading(event) {
- var _this4 = this;
-
- this.loading = ['stalled', 'waiting'].includes(event.type);
-
- // Clear timer
- clearTimeout(this.timers.loading);
-
- // Timer to prevent flicker when seeking
- this.timers.loading = setTimeout(function () {
- // Update progress bar loading class state
- toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading);
-
- // Update controls visibility
- ui.toggleControls.call(_this4);
- }, this.loading ? 250 : 0);
- },
-
-
- // Toggle controls based on state and `force` argument
- toggleControls: function toggleControls(force) {
- var controls$$1 = this.elements.controls;
-
-
- if (controls$$1 && this.config.hideControls) {
- // Show controls if force, loading, paused, or button interaction, otherwise hide
- this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover));
- }
- }
- };
-
- // ==========================================================================
-
- var Listeners = function () {
- function Listeners(player) {
- classCallCheck(this, Listeners);
-
- this.player = player;
- this.lastKey = null;
- this.focusTimer = null;
- this.lastKeyDown = null;
-
- this.handleKey = this.handleKey.bind(this);
- this.toggleMenu = this.toggleMenu.bind(this);
- this.setTabFocus = this.setTabFocus.bind(this);
- this.firstTouch = this.firstTouch.bind(this);
- }
-
- // Handle key presses
-
-
- createClass(Listeners, [{
- key: 'handleKey',
- value: function handleKey(event) {
- var player = this.player;
- var elements = player.elements;
-
- var code = event.keyCode ? event.keyCode : event.which;
- var pressed = event.type === 'keydown';
- var repeat = pressed && code === this.lastKey;
-
- // Bail if a modifier key is set
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
- return;
- }
-
- // If the event is bubbled from the media element
- // Firefox doesn't get the keycode for whatever reason
- if (!is$1.number(code)) {
- return;
- }
-
- // Seek by the number keys
- var seekByKey = function seekByKey() {
- // Divide the max duration into 10th's and times by the number value
- player.currentTime = player.duration / 10 * (code - 48);
- };
-
- // Handle the key on keydown
- // Reset on keyup
- if (pressed) {
- // Check focused element
- // and if the focused element is not editable (e.g. text input)
- // and any that accept key input http://webaim.org/techniques/keyboard/
- var focused = document.activeElement;
- if (is$1.element(focused)) {
- var editable = player.config.selectors.editable;
- var seek = elements.inputs.seek;
-
-
- if (focused !== seek && matches(focused, editable)) {
- return;
- }
-
- if (event.which === 32 && matches(focused, 'button, [role^="menuitem"]')) {
- return;
- }
- }
-
- // Which keycodes should we prevent default
- var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];
-
- // If the code is found prevent default (e.g. prevent scrolling for arrows)
- if (preventDefault.includes(code)) {
- event.preventDefault();
- event.stopPropagation();
- }
-
- switch (code) {
- case 48:
- case 49:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
- case 55:
- case 56:
- case 57:
- // 0-9
- if (!repeat) {
- seekByKey();
- }
- break;
-
- case 32:
- case 75:
- // Space and K key
- if (!repeat) {
- player.togglePlay();
- }
- break;
-
- case 38:
- // Arrow up
- player.increaseVolume(0.1);
- break;
-
- case 40:
- // Arrow down
- player.decreaseVolume(0.1);
- break;
-
- case 77:
- // M key
- if (!repeat) {
- player.muted = !player.muted;
- }
- break;
-
- case 39:
- // Arrow forward
- player.forward();
- break;
-
- case 37:
- // Arrow back
- player.rewind();
- break;
-
- case 70:
- // F key
- player.fullscreen.toggle();
- break;
-
- case 67:
- // C key
- if (!repeat) {
- player.toggleCaptions();
- }
- break;
-
- case 76:
- // L key
- player.loop = !player.loop;
- break;
-
- /* case 73:
- this.setLoop('start');
- break;
- case 76:
- this.setLoop();
- break;
- case 79:
- this.setLoop('end');
- break; */
-
- default:
- break;
- }
-
- // Escape is handle natively when in full screen
- // So we only need to worry about non native
- if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {
- player.fullscreen.toggle();
- }
-
- // Store last code for next cycle
- this.lastKey = code;
- } else {
- this.lastKey = null;
- }
- }
-
- // Toggle menu
-
- }, {
- key: 'toggleMenu',
- value: function toggleMenu(event) {
- controls.toggleMenu.call(this.player, event);
- }
-
- // Device is touch enabled
-
- }, {
- key: 'firstTouch',
- value: function firstTouch() {
- var player = this.player;
- var elements = player.elements;
-
-
- player.touch = true;
-
- // Add touch class
- toggleClass(elements.container, player.config.classNames.isTouch, true);
- }
- }, {
- key: 'setTabFocus',
- value: function setTabFocus(event) {
- var player = this.player;
- var elements = player.elements;
-
-
- clearTimeout(this.focusTimer);
-
- // Ignore any key other than tab
- if (event.type === 'keydown' && event.which !== 9) {
- return;
- }
-
- // Store reference to event timeStamp
- if (event.type === 'keydown') {
- this.lastKeyDown = event.timeStamp;
- }
-
- // Remove current classes
- var removeCurrent = function removeCurrent() {
- var className = player.config.classNames.tabFocus;
- var current = getElements.call(player, '.' + className);
- toggleClass(current, className, false);
- };
-
- // Determine if a key was pressed to trigger this event
- var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;
-
- // Ignore focus events if a key was pressed prior
- if (event.type === 'focus' && !wasKeyDown) {
- return;
- }
-
- // Remove all current
- removeCurrent();
-
- // Delay the adding of classname until the focus has changed
- // This event fires before the focusin event
- this.focusTimer = setTimeout(function () {
- var focused = document.activeElement;
-
- // Ignore if current focus element isn't inside the player
- if (!elements.container.contains(focused)) {
- return;
- }
-
- toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
- }, 10);
- }
-
- // Global window & document listeners
-
- }, {
- key: 'global',
- value: function global() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
- var player = this.player;
-
- // Keyboard shortcuts
-
- if (player.config.keyboard.global) {
- toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
- }
-
- // Click anywhere closes menu
- toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);
-
- // Detect touch by events
- once.call(player, document.body, 'touchstart', this.firstTouch);
-
- // Tab focus detection
- toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);
- }
-
- // Container listeners
-
- }, {
- key: 'container',
- value: function container() {
- var player = this.player;
- var elements = player.elements;
-
- // Keyboard shortcuts
-
- if (!player.config.keyboard.global && player.config.keyboard.focused) {
- on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
- }
-
- // Toggle controls on mouse events and entering fullscreen
- on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
- var controls$$1 = elements.controls;
-
- // Remove button states for fullscreen
-
- if (controls$$1 && event.type === 'enterfullscreen') {
- controls$$1.pressed = false;
- controls$$1.hover = false;
- }
-
- // Show, then hide after a timeout unless another control event occurs
- var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
-
- var delay = 0;
-
- if (show) {
- ui.toggleControls.call(player, true);
- // Use longer timeout for touch devices
- delay = player.touch ? 3000 : 2000;
- }
-
- // Clear timer
- clearTimeout(player.timers.controls);
-
- // Set new timer to prevent flicker when seeking
- player.timers.controls = setTimeout(function () {
- return ui.toggleControls.call(player, false);
- }, delay);
- });
- }
-
- // Listen for media events
-
- }, {
- key: 'media',
- value: function media() {
- var player = this.player;
- var elements = player.elements;
-
- // Time change on media
-
- on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
- return controls.timeUpdate.call(player, event);
- });
-
- // Display duration
- on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {
- return controls.durationUpdate.call(player, event);
- });
-
- // Check for audio tracks on load
- // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
- on.call(player, player.media, 'canplay', function () {
- toggleHidden(elements.volume, !player.hasAudio);
- toggleHidden(elements.buttons.mute, !player.hasAudio);
- });
-
- // Handle the media finishing
- on.call(player, player.media, 'ended', function () {
- // Show poster on end
- if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {
- // Restart
- player.restart();
- }
- });
-
- // Check for buffer progress
- on.call(player, player.media, 'progress playing seeking seeked', function (event) {
- return controls.updateProgress.call(player, event);
- });
-
- // Handle volume changes
- on.call(player, player.media, 'volumechange', function (event) {
- return controls.updateVolume.call(player, event);
- });
-
- // Handle play/pause
- on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {
- return ui.checkPlaying.call(player, event);
- });
-
- // Loading state
- on.call(player, player.media, 'waiting canplay seeked playing', function (event) {
- return ui.checkLoading.call(player, event);
- });
-
- // If autoplay, then load advertisement if required
- // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows
- on.call(player, player.media, 'playing', function () {
- if (!player.ads) {
- return;
- }
-
- // If ads are enabled, wait for them first
- if (player.ads.enabled && !player.ads.initialized) {
- // Wait for manager response
- player.ads.managerPromise.then(function () {
- return player.ads.play();
- }).catch(function () {
- return player.play();
- });
- }
- });
-
- // Click video
- if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {
- // Re-fetch the wrapper
- var wrapper = getElement.call(player, '.' + player.config.classNames.video);
-
- // Bail if there's no wrapper (this should never happen)
- if (!is$1.element(wrapper)) {
- return;
- }
-
- // On click play, pause ore restart
- on.call(player, elements.container, 'click touchstart', function (event) {
- var targets = [elements.container, wrapper];
-
- // Ignore if click if not container or in video wrapper
- if (!targets.includes(event.target) && !wrapper.contains(event.target)) {
- return;
- }
-
- // First touch on touch devices will just show controls (if we're hiding controls)
- // If controls are shown then it'll toggle like a pointer device
- if (player.config.hideControls && player.touch && hasClass(elements.container, player.config.classNames.hideControls)) {
- return;
- }
-
- if (player.ended) {
- player.restart();
- player.play();
- } else {
- player.togglePlay();
- }
- });
- }
-
- // Disable right click
- if (player.supported.ui && player.config.disableContextMenu) {
- on.call(player, elements.wrapper, 'contextmenu', function (event) {
- event.preventDefault();
- }, false);
- }
-
- // Volume change
- on.call(player, player.media, 'volumechange', function () {
- // Save to storage
- player.storage.set({
- volume: player.volume,
- muted: player.muted
- });
- });
-
- // Speed change
- on.call(player, player.media, 'ratechange', function () {
- // Update UI
- controls.updateSetting.call(player, 'speed');
-
- // Save to storage
- player.storage.set({ speed: player.speed });
- });
-
- // Quality change
- on.call(player, player.media, 'qualitychange', function (event) {
- // Update UI
- controls.updateSetting.call(player, 'quality', null, event.detail.quality);
- });
-
- // Proxy events to container
- // Bubble up key events for Edge
- var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');
-
- on.call(player, player.media, proxyEvents, function (event) {
- var _event$detail = event.detail,
- detail = _event$detail === undefined ? {} : _event$detail;
-
- // Get error details from media
-
- if (event.type === 'error') {
- detail = player.media.error;
- }
-
- triggerEvent.call(player, elements.container, event.type, true, detail);
- });
- }
-
- // Run default and custom handlers
-
- }, {
- key: 'proxy',
- value: function proxy(event, defaultHandler, customHandlerKey) {
- var player = this.player;
-
- var customHandler = player.config.listeners[customHandlerKey];
- var hasCustomHandler = is$1.function(customHandler);
- var returned = true;
-
- // Execute custom handler
- if (hasCustomHandler) {
- returned = customHandler.call(player, event);
- }
-
- // Only call default handler if not prevented in custom handler
- if (returned && is$1.function(defaultHandler)) {
- defaultHandler.call(player, event);
- }
- }
-
- // Trigger custom and default handlers
-
- }, {
- key: 'bind',
- value: function bind(element, type, defaultHandler, customHandlerKey) {
- var _this = this;
-
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var player = this.player;
-
- var customHandler = player.config.listeners[customHandlerKey];
- var hasCustomHandler = is$1.function(customHandler);
-
- on.call(player, element, type, function (event) {
- return _this.proxy(event, defaultHandler, customHandlerKey);
- }, passive && !hasCustomHandler);
- }
-
- // Listen for control events
-
- }, {
- key: 'controls',
- value: function controls$$1() {
- var _this2 = this;
-
- var player = this.player;
- var elements = player.elements;
-
- // IE doesn't support input event, so we fallback to change
-
- var inputEvent = browser.isIE ? 'change' : 'input';
-
- // Play/pause toggle
- if (elements.buttons.play) {
- Array.from(elements.buttons.play).forEach(function (button) {
- _this2.bind(button, 'click', player.togglePlay, 'play');
- });
- }
-
- // Pause
- this.bind(elements.buttons.restart, 'click', player.restart, 'restart');
-
- // Rewind
- this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');
-
- // Rewind
- this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');
-
- // Mute toggle
- this.bind(elements.buttons.mute, 'click', function () {
- player.muted = !player.muted;
- }, 'mute');
-
- // Captions toggle
- this.bind(elements.buttons.captions, 'click', function () {
- return player.toggleCaptions();
- });
-
- // Fullscreen toggle
- this.bind(elements.buttons.fullscreen, 'click', function () {
- player.fullscreen.toggle();
- }, 'fullscreen');
-
- // Picture-in-Picture
- this.bind(elements.buttons.pip, 'click', function () {
- player.pip = 'toggle';
- }, 'pip');
-
- // Airplay
- this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');
-
- // Settings menu - click toggle
- this.bind(elements.buttons.settings, 'click', function (event) {
- // Prevent the document click listener closing the menu
- event.stopPropagation();
-
- controls.toggleMenu.call(player, event);
- });
-
- // Settings menu - keyboard toggle
- // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
- this.bind(elements.buttons.settings, 'keyup', function (event) {
- var code = event.which;
-
- // We only care about space and return
- if (![13, 32].includes(code)) {
- return;
- }
-
- // Because return triggers a click anyway, all we need to do is set focus
- if (code === 13) {
- controls.focusFirstMenuItem.call(player, null, true);
- return;
- }
-
- // Prevent scroll
- event.preventDefault();
-
- // Prevent playing video (Firefox)
- event.stopPropagation();
-
- // Toggle menu
- controls.toggleMenu.call(player, event);
- }, null, false // Can't be passive as we're preventing default
- );
-
- // Escape closes menu
- this.bind(elements.settings.menu, 'keydown', function (event) {
- if (event.which === 27) {
- controls.toggleMenu.call(player, event);
- }
- });
-
- // Set range input alternative "value", which matches the tooltip time (#954)
- this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {
- var rect = elements.progress.getBoundingClientRect();
- var percent = 100 / rect.width * (event.pageX - rect.left);
- event.currentTarget.setAttribute('seek-value', percent);
- });
-
- // Pause while seeking
- this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
- var seek = event.currentTarget;
- var code = event.keyCode ? event.keyCode : event.which;
- var attribute = 'play-on-seeked';
-
- if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {
- return;
- }
-
- // Was playing before?
- var play = seek.hasAttribute(attribute);
-
- // Done seeking
- var done = ['mouseup', 'touchend', 'keyup'].includes(event.type);
-
- // If we're done seeking and it was playing, resume playback
- if (play && done) {
- seek.removeAttribute(attribute);
- player.play();
- } else if (!done && player.playing) {
- seek.setAttribute(attribute, '');
- player.pause();
- }
- });
-
- // Fix range inputs on iOS
- // Super weird iOS bug where after you interact with an <input type="range">,
- // it takes over further interactions on the page. This is a hack
- if (browser.isIos) {
- var inputs = getElements.call(player, 'input[type="range"]');
- Array.from(inputs).forEach(function (input) {
- return _this2.bind(input, inputEvent, function (event) {
- return repaint(event.target);
- });
- });
- }
-
- // Seek
- this.bind(elements.inputs.seek, inputEvent, function (event) {
- var seek = event.currentTarget;
-
- // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
- var seekTo = seek.getAttribute('seek-value');
-
- if (is$1.empty(seekTo)) {
- seekTo = seek.value;
- }
-
- seek.removeAttribute('seek-value');
-
- player.currentTime = seekTo / seek.max * player.duration;
- }, 'seek');
-
- // Seek tooltip
- this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
- return controls.updateSeekTooltip.call(player, event);
- });
-
- // Polyfill for lower fill in <input type="range"> for webkit
- if (browser.isWebkit) {
- Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
- _this2.bind(element, 'input', function (event) {
- return controls.updateRangeFill.call(player, event.target);
- });
- });
- }
-
- // Current time invert
- // Only if one time element is used for both currentTime and duration
- if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {
- this.bind(elements.display.currentTime, 'click', function () {
- // Do nothing if we're at the start
- if (player.currentTime === 0) {
- return;
- }
-
- player.config.invertTime = !player.config.invertTime;
-
- controls.timeUpdate.call(player);
- });
- }
-
- // Volume
- this.bind(elements.inputs.volume, inputEvent, function (event) {
- player.volume = event.target.value;
- }, 'volume');
-
- // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
- this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
- elements.controls.hover = !player.touch && event.type === 'mouseenter';
- });
-
- // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
- this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
- elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
- });
-
- // Focus in/out on controls
- this.bind(elements.controls, 'focusin focusout', function (event) {
- var config = player.config,
- elements = player.elements,
- timers = player.timers;
-
- var isFocusIn = event.type === 'focusin';
-
- // Skip transition to prevent focus from scrolling the parent element
- toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);
-
- // Toggle
- ui.toggleControls.call(player, isFocusIn);
-
- // If focusin, hide again after delay
- if (isFocusIn) {
- // Restore transition
- setTimeout(function () {
- toggleClass(elements.controls, config.classNames.noTransition, false);
- }, 0);
-
- // Delay a little more for keyboard users
- var delay = _this2.touch ? 3000 : 4000;
-
- // Clear timer
- clearTimeout(timers.controls);
-
- // Hide
- timers.controls = setTimeout(function () {
- return ui.toggleControls.call(player, false);
- }, delay);
- }
- });
-
- // Mouse wheel for volume
- this.bind(elements.inputs.volume, 'wheel', function (event) {
- // Detect "natural" scroll - suppored on OS X Safari only
- // Other browsers on OS X will be inverted until support improves
- var inverted = event.webkitDirectionInvertedFromDevice;
-
- // Get delta from event. Invert if `inverted` is true
-
- var _map = [event.deltaX, -event.deltaY].map(function (value) {
- return inverted ? -value : value;
- }),
- _map2 = slicedToArray(_map, 2),
- x = _map2[0],
- y = _map2[1];
-
- // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)
-
-
- var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);
-
- // Change the volume by 2%
- player.increaseVolume(direction / 50);
-
- // Don't break page scrolling at max and min
- var volume = player.media.volume;
-
- if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {
- event.preventDefault();
- }
- }, 'volume', false);
- }
- }]);
- return Listeners;
- }();
-
- var loadjs_umd = createCommonjsModule(function (module, exports) {
- (function(root, factory) {
- if (typeof undefined === 'function' && undefined.amd) {
- undefined([], factory);
- } else {
- module.exports = factory();
- }
- }(commonjsGlobal, function() {
- /**
- * Global dependencies.
- * @global {Object} document - DOM
- */
-
- var devnull = function() {},
- bundleIdCache = {},
- bundleResultCache = {},
- bundleCallbackQueue = {};
-
-
- /**
- * Subscribe to bundle load event.
- * @param {string[]} bundleIds - Bundle ids
- * @param {Function} callbackFn - The callback function
- */
- function subscribe(bundleIds, callbackFn) {
- // listify
- bundleIds = bundleIds.push ? bundleIds : [bundleIds];
-
- var depsNotFound = [],
- i = bundleIds.length,
- numWaiting = i,
- fn,
- bundleId,
- r,
- q;
-
- // define callback function
- fn = function (bundleId, pathsNotFound) {
- if (pathsNotFound.length) depsNotFound.push(bundleId);
-
- numWaiting--;
- if (!numWaiting) callbackFn(depsNotFound);
- };
-
- // register callback
- while (i--) {
- bundleId = bundleIds[i];
-
- // execute callback if in result cache
- r = bundleResultCache[bundleId];
- if (r) {
- fn(bundleId, r);
- continue;
- }
-
- // add to callback queue
- q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
- q.push(fn);
- }
- }
-
-
- /**
- * Publish bundle load event.
- * @param {string} bundleId - Bundle id
- * @param {string[]} pathsNotFound - List of files not found
- */
- function publish(bundleId, pathsNotFound) {
- // exit if id isn't defined
- if (!bundleId) return;
-
- var q = bundleCallbackQueue[bundleId];
-
- // cache result
- bundleResultCache[bundleId] = pathsNotFound;
-
- // exit if queue is empty
- if (!q) return;
-
- // empty callback queue
- while (q.length) {
- q[0](bundleId, pathsNotFound);
- q.splice(0, 1);
- }
- }
-
-
- /**
- * Execute callbacks.
- * @param {Object or Function} args - The callback args
- * @param {string[]} depsNotFound - List of dependencies not found
- */
- function executeCallbacks(args, depsNotFound) {
- // accept function as argument
- if (args.call) args = {success: args};
-
- // success and error callbacks
- if (depsNotFound.length) (args.error || devnull)(depsNotFound);
- else (args.success || devnull)(args);
- }
-
-
- /**
- * Load individual file.
- * @param {string} path - The file path
- * @param {Function} callbackFn - The callback function
- */
- function loadFile(path, callbackFn, args, numTries) {
- var doc = document,
- async = args.async,
- maxTries = (args.numRetries || 0) + 1,
- beforeCallbackFn = args.before || devnull,
- pathStripped = path.replace(/^(css|img)!/, ''),
- isCss,
- e;
-
- numTries = numTries || 0;
-
- if (/(^css!|\.css$)/.test(path)) {
- isCss = true;
-
- // css
- e = doc.createElement('link');
- e.rel = 'stylesheet';
- e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
- } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
- // image
- e = doc.createElement('img');
- e.src = pathStripped;
- } else {
- // javascript
- e = doc.createElement('script');
- e.src = path;
- e.async = async === undefined ? true : async;
- }
-
- e.onload = e.onerror = e.onbeforeload = function (ev) {
- var result = ev.type[0];
-
- // Note: The following code isolates IE using `hideFocus` and treats empty
- // stylesheets as failures to get around lack of onerror support
- if (isCss && 'hideFocus' in e) {
- try {
- if (!e.sheet.cssText.length) result = 'e';
- } catch (x) {
- // sheets objects created from load errors don't allow access to
- // `cssText`
- result = 'e';
- }
- }
-
- // handle retries in case of load failure
- if (result == 'e') {
- // increment counter
- numTries += 1;
-
- // exit function and try again
- if (numTries < maxTries) {
- return loadFile(path, callbackFn, args, numTries);
- }
- }
-
- // execute callback
- callbackFn(path, result, ev.defaultPrevented);
- };
-
- // add to document (unless callback returns `false`)
- if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
- }
-
-
- /**
- * Load multiple files.
- * @param {string[]} paths - The file paths
- * @param {Function} callbackFn - The callback function
- */
- function loadFiles(paths, callbackFn, args) {
- // listify paths
- paths = paths.push ? paths : [paths];
-
- var numWaiting = paths.length,
- x = numWaiting,
- pathsNotFound = [],
- fn,
- i;
-
- // define callback function
- fn = function(path, result, defaultPrevented) {
- // handle error
- if (result == 'e') pathsNotFound.push(path);
-
- // handle beforeload event. If defaultPrevented then that means the load
- // will be blocked (ex. Ghostery/ABP on Safari)
- if (result == 'b') {
- if (defaultPrevented) pathsNotFound.push(path);
- else return;
- }
-
- numWaiting--;
- if (!numWaiting) callbackFn(pathsNotFound);
- };
-
- // load scripts
- for (i=0; i < x; i++) loadFile(paths[i], fn, args);
- }
-
-
- /**
- * Initiate script load and register bundle.
- * @param {(string|string[])} paths - The file paths
- * @param {(string|Function)} [arg1] - The bundleId or success callback
- * @param {Function} [arg2] - The success or error callback
- * @param {Function} [arg3] - The error callback
- */
- function loadjs(paths, arg1, arg2) {
- var bundleId,
- args;
-
- // bundleId (if string)
- if (arg1 && arg1.trim) bundleId = arg1;
-
- // args (default is {})
- args = (bundleId ? arg2 : arg1) || {};
-
- // throw error if bundle is already defined
- if (bundleId) {
- if (bundleId in bundleIdCache) {
- throw "LoadJS";
- } else {
- bundleIdCache[bundleId] = true;
- }
- }
-
- // load scripts
- loadFiles(paths, function (pathsNotFound) {
- // execute callbacks
- executeCallbacks(args, pathsNotFound);
-
- // publish bundle load event
- publish(bundleId, pathsNotFound);
- }, args);
- }
-
-
- /**
- * Execute callbacks when dependencies have been satisfied.
- * @param {(string|string[])} deps - List of bundle ids
- * @param {Object} args - success/error arguments
- */
- loadjs.ready = function ready(deps, args) {
- // subscribe to bundle load event
- subscribe(deps, function (depsNotFound) {
- // execute callbacks
- executeCallbacks(args, depsNotFound);
- });
-
- return loadjs;
- };
-
-
- /**
- * Manually satisfy bundle dependencies.
- * @param {string} bundleId - The bundle id
- */
- loadjs.done = function done(bundleId) {
- publish(bundleId, []);
- };
-
-
- /**
- * Reset loadjs dependencies statuses
- */
- loadjs.reset = function reset() {
- bundleIdCache = {};
- bundleResultCache = {};
- bundleCallbackQueue = {};
- };
-
-
- /**
- * Determine if bundle has already been defined
- * @param String} bundleId - The bundle id
- */
- loadjs.isDefined = function isDefined(bundleId) {
- return bundleId in bundleIdCache;
- };
-
-
- // export
- return loadjs;
-
- }));
- });
-
- // ==========================================================================
-
- function loadScript(url) {
- return new Promise(function (resolve, reject) {
- loadjs_umd(url, {
- success: resolve,
- error: reject
- });
- });
- }
-
- // ==========================================================================
-
- // Parse Vimeo ID from URL
- function parseId(url) {
- if (is$1.empty(url)) {
- return null;
- }
-
- if (is$1.number(Number(url))) {
- return url;
- }
-
- var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
- return url.match(regex) ? RegExp.$2 : url;
- }
-
- // Get aspect ratio for dimensions
- function getAspectRatio(width, height) {
- var getRatio = function getRatio(w, h) {
- return h === 0 ? w : getRatio(h, w % h);
- };
- var ratio = getRatio(width, height);
- return width / ratio + ':' + height / ratio;
- }
-
- // Set playback state and trigger change (only on actual change)
- function assurePlaybackState(play) {
- if (play && !this.embed.hasPlayed) {
- this.embed.hasPlayed = true;
- }
- if (this.media.paused === play) {
- this.media.paused = !play;
- triggerEvent.call(this, this.media, play ? 'play' : 'pause');
- }
- }
-
- var vimeo = {
- setup: function setup() {
- var _this = this;
-
- // Add embed class for responsive
- toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
-
- // Set intial ratio
- vimeo.setAspectRatio.call(this);
-
- // Load the API if not already
- if (!is$1.object(window.Vimeo)) {
- loadScript(this.config.urls.vimeo.sdk).then(function () {
- vimeo.ready.call(_this);
- }).catch(function (error) {
- _this.debug.warn('Vimeo API failed to load', error);
- });
- } else {
- vimeo.ready.call(this);
- }
- },
-
-
- // Set aspect ratio
- // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI
- setAspectRatio: function setAspectRatio(input) {
- var _split = (is$1.string(input) ? input : this.config.ratio).split(':'),
- _split2 = slicedToArray(_split, 2),
- x = _split2[0],
- y = _split2[1];
-
- var padding = 100 / x * y;
- this.elements.wrapper.style.paddingBottom = padding + '%';
-
- if (this.supported.ui) {
- var height = 240;
- var offset = (height - padding) / (height / 50);
-
- this.media.style.transform = 'translateY(-' + offset + '%)';
- }
- },
-
-
- // API Ready
- ready: function ready$$1() {
- var _this2 = this;
-
- var player = this;
-
- // Get Vimeo params for the iframe
- var options = {
- loop: player.config.loop.active,
- autoplay: player.autoplay,
- // muted: player.muted,
- byline: false,
- portrait: false,
- title: false,
- speed: true,
- transparent: 0,
- gesture: 'media',
- playsinline: !this.config.fullscreen.iosNative
- };
- var params = buildUrlParams(options);
-
- // Get the source URL or ID
- var source = player.media.getAttribute('src');
-
- // Get from <div> if needed
- if (is$1.empty(source)) {
- source = player.media.getAttribute(player.config.attributes.embed.id);
- }
-
- var id = parseId(source);
-
- // Build an iframe
- var iframe = createElement('iframe');
- var src = format(player.config.urls.vimeo.iframe, id, params);
- iframe.setAttribute('src', src);
- iframe.setAttribute('allowfullscreen', '');
- iframe.setAttribute('allowtransparency', '');
- iframe.setAttribute('allow', 'autoplay');
-
- // Get poster, if already set
- var poster = player.poster;
-
- // Inject the package
-
- var wrapper = createElement('div', { poster: poster, class: player.config.classNames.embedContainer });
- wrapper.appendChild(iframe);
- player.media = replaceElement(wrapper, player.media);
-
- // Get poster image
- fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
- if (is$1.empty(response)) {
- return;
- }
-
- // Get the URL for thumbnail
- var url = new URL(response[0].thumbnail_large);
-
- // Get original image
- url.pathname = url.pathname.split('_')[0] + '.jpg';
-
- // Set and show poster
- ui.setPoster.call(player, url.href).catch(function () {});
- });
-
- // Setup instance
- // https://github.com/vimeo/player.js
- player.embed = new window.Vimeo.Player(iframe, {
- autopause: player.config.autopause,
- muted: player.muted
- });
-
- player.media.paused = true;
- player.media.currentTime = 0;
-
- // Disable native text track rendering
- if (player.supported.ui) {
- player.embed.disableTextTrack();
- }
-
- // Create a faux HTML5 API using the Vimeo API
- player.media.play = function () {
- assurePlaybackState.call(player, true);
- return player.embed.play();
- };
-
- player.media.pause = function () {
- assurePlaybackState.call(player, false);
- return player.embed.pause();
- };
-
- player.media.stop = function () {
- player.pause();
- player.currentTime = 0;
- };
-
- // Seeking
- var currentTime = player.media.currentTime;
-
- Object.defineProperty(player.media, 'currentTime', {
- get: function get() {
- return currentTime;
- },
- set: function set(time) {
- // Vimeo will automatically play on seek if the video hasn't been played before
-
- // Get current paused state and volume etc
- var embed = player.embed,
- media = player.media,
- paused = player.paused,
- volume = player.volume;
-
- var restorePause = paused && !embed.hasPlayed;
-
- // Set seeking state and trigger event
- media.seeking = true;
- triggerEvent.call(player, media, 'seeking');
-
- // If paused, mute until seek is complete
- Promise.resolve(restorePause && embed.setVolume(0))
- // Seek
- .then(function () {
- return embed.setCurrentTime(time);
- })
- // Restore paused
- .then(function () {
- return restorePause && embed.pause();
- })
- // Restore volume
- .then(function () {
- return restorePause && embed.setVolume(volume);
- }).catch(function () {
- // Do nothing
- });
- }
- });
-
- // Playback speed
- var speed = player.config.speed.selected;
- Object.defineProperty(player.media, 'playbackRate', {
- get: function get() {
- return speed;
- },
- set: function set(input) {
- player.embed.setPlaybackRate(input).then(function () {
- speed = input;
- triggerEvent.call(player, player.media, 'ratechange');
- }).catch(function (error) {
- // Hide menu item (and menu if empty)
- if (error.name === 'Error') {
- controls.setSpeedMenu.call(player, []);
- }
- });
- }
- });
-
- // Volume
- var volume = player.config.volume;
-
- Object.defineProperty(player.media, 'volume', {
- get: function get() {
- return volume;
- },
- set: function set(input) {
- player.embed.setVolume(input).then(function () {
- volume = input;
- triggerEvent.call(player, player.media, 'volumechange');
- });
- }
- });
-
- // Muted
- var muted = player.config.muted;
-
- Object.defineProperty(player.media, 'muted', {
- get: function get() {
- return muted;
- },
- set: function set(input) {
- var toggle = is$1.boolean(input) ? input : false;
-
- player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
- muted = toggle;
- triggerEvent.call(player, player.media, 'volumechange');
- });
- }
- });
-
- // Loop
- var loop = player.config.loop;
-
- Object.defineProperty(player.media, 'loop', {
- get: function get() {
- return loop;
- },
- set: function set(input) {
- var toggle = is$1.boolean(input) ? input : player.config.loop.active;
-
- player.embed.setLoop(toggle).then(function () {
- loop = toggle;
- });
- }
- });
-
- // Source
- var currentSrc = void 0;
- player.embed.getVideoUrl().then(function (value) {
- currentSrc = value;
- }).catch(function (error) {
- _this2.debug.warn(error);
- });
-
- Object.defineProperty(player.media, 'currentSrc', {
- get: function get() {
- return currentSrc;
- }
- });
-
- // Ended
- Object.defineProperty(player.media, 'ended', {
- get: function get() {
- return player.currentTime === player.duration;
- }
- });
-
- // Set aspect ratio based on video size
- Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
- var ratio = getAspectRatio(dimensions[0], dimensions[1]);
- vimeo.setAspectRatio.call(_this2, ratio);
- });
-
- // Set autopause
- player.embed.setAutopause(player.config.autopause).then(function (state) {
- player.config.autopause = state;
- });
-
- // Get title
- player.embed.getVideoTitle().then(function (title) {
- player.config.title = title;
- ui.setTitle.call(_this2);
- });
-
- // Get current time
- player.embed.getCurrentTime().then(function (value) {
- currentTime = value;
- triggerEvent.call(player, player.media, 'timeupdate');
- });
-
- // Get duration
- player.embed.getDuration().then(function (value) {
- player.media.duration = value;
- triggerEvent.call(player, player.media, 'durationchange');
- });
-
- // Get captions
- player.embed.getTextTracks().then(function (tracks) {
- player.media.textTracks = tracks;
- captions.setup.call(player);
- });
-
- player.embed.on('cuechange', function (_ref) {
- var _ref$cues = _ref.cues,
- cues = _ref$cues === undefined ? [] : _ref$cues;
-
- var strippedCues = cues.map(function (cue) {
- return stripHTML(cue.text);
- });
- captions.updateCues.call(player, strippedCues);
- });
-
- player.embed.on('loaded', function () {
- // Assure state and events are updated on autoplay
- player.embed.getPaused().then(function (paused) {
- assurePlaybackState.call(player, !paused);
- if (!paused) {
- triggerEvent.call(player, player.media, 'playing');
- }
- });
-
- if (is$1.element(player.embed.element) && player.supported.ui) {
- var frame = player.embed.element;
-
- // Fix keyboard focus issues
- // https://github.com/sampotts/plyr/issues/317
- frame.setAttribute('tabindex', -1);
- }
- });
-
- player.embed.on('play', function () {
- assurePlaybackState.call(player, true);
- triggerEvent.call(player, player.media, 'playing');
- });
-
- player.embed.on('pause', function () {
- assurePlaybackState.call(player, false);
- });
-
- player.embed.on('timeupdate', function (data) {
- player.media.seeking = false;
- currentTime = data.seconds;
- triggerEvent.call(player, player.media, 'timeupdate');
- });
-
- player.embed.on('progress', function (data) {
- player.media.buffered = data.percent;
- triggerEvent.call(player, player.media, 'progress');
-
- // Check all loaded
- if (parseInt(data.percent, 10) === 1) {
- triggerEvent.call(player, player.media, 'canplaythrough');
- }
-
- // Get duration as if we do it before load, it gives an incorrect value
- // https://github.com/sampotts/plyr/issues/891
- player.embed.getDuration().then(function (value) {
- if (value !== player.media.duration) {
- player.media.duration = value;
- triggerEvent.call(player, player.media, 'durationchange');
- }
- });
- });
-
- player.embed.on('seeked', function () {
- player.media.seeking = false;
- triggerEvent.call(player, player.media, 'seeked');
- });
-
- player.embed.on('ended', function () {
- player.media.paused = true;
- triggerEvent.call(player, player.media, 'ended');
- });
-
- player.embed.on('error', function (detail) {
- player.media.error = detail;
- triggerEvent.call(player, player.media, 'error');
- });
-
- // Rebuild UI
- setTimeout(function () {
- return ui.build.call(player);
- }, 0);
- }
- };
-
- // ==========================================================================
-
- // Parse YouTube ID from URL
- function parseId$1(url) {
- if (is$1.empty(url)) {
- return null;
- }
-
- var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
- return url.match(regex) ? RegExp.$2 : url;
- }
-
- // Set playback state and trigger change (only on actual change)
- function assurePlaybackState$1(play) {
- if (play && !this.embed.hasPlayed) {
- this.embed.hasPlayed = true;
- }
- if (this.media.paused === play) {
- this.media.paused = !play;
- triggerEvent.call(this, this.media, play ? 'play' : 'pause');
- }
- }
-
- var youtube = {
- setup: function setup() {
- var _this = this;
-
- // Add embed class for responsive
- toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
-
- // Set aspect ratio
- youtube.setAspectRatio.call(this);
-
- // Setup API
- if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {
- youtube.ready.call(this);
- } else {
- // Load the API
- loadScript(this.config.urls.youtube.sdk).catch(function (error) {
- _this.debug.warn('YouTube API failed to load', error);
- });
-
- // Setup callback for the API
- // YouTube has it's own system of course...
- window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];
-
- // Add to queue
- window.onYouTubeReadyCallbacks.push(function () {
- youtube.ready.call(_this);
- });
-
- // Set callback to process queue
- window.onYouTubeIframeAPIReady = function () {
- window.onYouTubeReadyCallbacks.forEach(function (callback) {
- callback();
- });
- };
- }
- },
-
-
- // Get the media title
- getTitle: function getTitle(videoId) {
- var _this2 = this;
-
- // Try via undocumented API method first
- // This method disappears now and then though...
- // https://github.com/sampotts/plyr/issues/709
- if (is$1.function(this.embed.getVideoData)) {
- var _embed$getVideoData = this.embed.getVideoData(),
- title = _embed$getVideoData.title;
-
- if (is$1.empty(title)) {
- this.config.title = title;
- ui.setTitle.call(this);
- return;
- }
- }
-
- // Or via Google API
- var key = this.config.keys.google;
- if (is$1.string(key) && !is$1.empty(key)) {
- var url = format(this.config.urls.youtube.api, videoId, key);
-
- fetch(url).then(function (result) {
- if (is$1.object(result)) {
- _this2.config.title = result.items[0].snippet.title;
- ui.setTitle.call(_this2);
- }
- }).catch(function () {});
- }
- },
-
-
- // Set aspect ratio
- setAspectRatio: function setAspectRatio() {
- var ratio = this.config.ratio.split(':');
- this.elements.wrapper.style.paddingBottom = 100 / ratio[0] * ratio[1] + '%';
- },
-
-
- // API ready
- ready: function ready$$1() {
- var player = this;
-
- // Ignore already setup (race condition)
- var currentId = player.media.getAttribute('id');
- if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {
- return;
- }
-
- // Get the source URL or ID
- var source = player.media.getAttribute('src');
-
- // Get from <div> if needed
- if (is$1.empty(source)) {
- source = player.media.getAttribute(this.config.attributes.embed.id);
- }
-
- // Replace the <iframe> with a <div> due to YouTube API issues
- var videoId = parseId$1(source);
- var id = generateId(player.provider);
-
- // Get poster, if already set
- var poster = player.poster;
-
- // Replace media element
-
- var container = createElement('div', { id: id, poster: poster });
- player.media = replaceElement(container, player.media);
-
- // Id to poster wrapper
- var posterSrc = function posterSrc(format$$1) {
- return 'https://img.youtube.com/vi/' + videoId + '/' + format$$1 + 'default.jpg';
- };
-
- // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
- loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
- .catch(function () {
- return loadImage(posterSrc('sd'), 121);
- }) // 480p padded 4:3
- .catch(function () {
- return loadImage(posterSrc('hq'));
- }) // 360p padded 4:3. Always exists
- .then(function (image) {
- return ui.setPoster.call(player, image.src);
- }).then(function (posterSrc) {
- // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
- if (!posterSrc.includes('maxres')) {
- player.elements.poster.style.backgroundSize = 'cover';
- }
- }).catch(function () {});
-
- // Setup instance
- // https://developers.google.com/youtube/iframe_api_reference
- player.embed = new window.YT.Player(id, {
- videoId: videoId,
- playerVars: {
- autoplay: player.config.autoplay ? 1 : 0, // Autoplay
- hl: player.config.hl, // iframe interface language
- controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported
- rel: 0, // No related vids
- showinfo: 0, // Hide info
- iv_load_policy: 3, // Hide annotations
- modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)
- disablekb: 1, // Disable keyboard as we handle it
- playsinline: 1, // Allow iOS inline playback
-
- // Tracking for stats
- // origin: window ? `${window.location.protocol}//${window.location.host}` : null,
- widget_referrer: window ? window.location.href : null,
-
- // Captions are flaky on YouTube
- cc_load_policy: player.captions.active ? 1 : 0,
- cc_lang_pref: player.config.captions.language
- },
- events: {
- onError: function onError(event) {
- // YouTube may fire onError twice, so only handle it once
- if (!player.media.error) {
- var code = event.data;
- // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
- var message = {
- 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
- 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
- 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
- 101: 'The owner of the requested video does not allow it to be played in embedded players.',
- 150: 'The owner of the requested video does not allow it to be played in embedded players.'
- }[code] || 'An unknown error occured';
-
- player.media.error = { code: code, message: message };
-
- triggerEvent.call(player, player.media, 'error');
- }
- },
- onPlaybackRateChange: function onPlaybackRateChange(event) {
- // Get the instance
- var instance = event.target;
-
- // Get current speed
- player.media.playbackRate = instance.getPlaybackRate();
-
- triggerEvent.call(player, player.media, 'ratechange');
- },
- onReady: function onReady(event) {
- // Bail if onReady has already been called. See issue #1108
- if (is$1.function(player.media.play)) {
- return;
- }
- // Get the instance
- var instance = event.target;
-
- // Get the title
- youtube.getTitle.call(player, videoId);
-
- // Create a faux HTML5 API using the YouTube API
- player.media.play = function () {
- assurePlaybackState$1.call(player, true);
- instance.playVideo();
- };
-
- player.media.pause = function () {
- assurePlaybackState$1.call(player, false);
- instance.pauseVideo();
- };
-
- player.media.stop = function () {
- instance.stopVideo();
- };
-
- player.media.duration = instance.getDuration();
- player.media.paused = true;
-
- // Seeking
- player.media.currentTime = 0;
- Object.defineProperty(player.media, 'currentTime', {
- get: function get() {
- return Number(instance.getCurrentTime());
- },
- set: function set(time) {
- // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
- if (player.paused && !player.embed.hasPlayed) {
- player.embed.mute();
- }
-
- // Set seeking state and trigger event
- player.media.seeking = true;
- triggerEvent.call(player, player.media, 'seeking');
-
- // Seek after events sent
- instance.seekTo(time);
- }
- });
-
- // Playback speed
- Object.defineProperty(player.media, 'playbackRate', {
- get: function get() {
- return instance.getPlaybackRate();
- },
- set: function set(input) {
- instance.setPlaybackRate(input);
- }
- });
-
- // Volume
- var volume = player.config.volume;
-
- Object.defineProperty(player.media, 'volume', {
- get: function get() {
- return volume;
- },
- set: function set(input) {
- volume = input;
- instance.setVolume(volume * 100);
- triggerEvent.call(player, player.media, 'volumechange');
- }
- });
-
- // Muted
- var muted = player.config.muted;
-
- Object.defineProperty(player.media, 'muted', {
- get: function get() {
- return muted;
- },
- set: function set(input) {
- var toggle = is$1.boolean(input) ? input : muted;
- muted = toggle;
- instance[toggle ? 'mute' : 'unMute']();
- triggerEvent.call(player, player.media, 'volumechange');
- }
- });
-
- // Source
- Object.defineProperty(player.media, 'currentSrc', {
- get: function get() {
- return instance.getVideoUrl();
- }
- });
-
- // Ended
- Object.defineProperty(player.media, 'ended', {
- get: function get() {
- return player.currentTime === player.duration;
- }
- });
-
- // Get available speeds
- player.options.speed = instance.getAvailablePlaybackRates();
-
- // Set the tabindex to avoid focus entering iframe
- if (player.supported.ui) {
- player.media.setAttribute('tabindex', -1);
- }
-
- triggerEvent.call(player, player.media, 'timeupdate');
- triggerEvent.call(player, player.media, 'durationchange');
-
- // Reset timer
- clearInterval(player.timers.buffering);
-
- // Setup buffering
- player.timers.buffering = setInterval(function () {
- // Get loaded % from YouTube
- player.media.buffered = instance.getVideoLoadedFraction();
-
- // Trigger progress only when we actually buffer something
- if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
- triggerEvent.call(player, player.media, 'progress');
- }
-
- // Set last buffer point
- player.media.lastBuffered = player.media.buffered;
-
- // Bail if we're at 100%
- if (player.media.buffered === 1) {
- clearInterval(player.timers.buffering);
-
- // Trigger event
- triggerEvent.call(player, player.media, 'canplaythrough');
- }
- }, 200);
-
- // Rebuild UI
- setTimeout(function () {
- return ui.build.call(player);
- }, 50);
- },
- onStateChange: function onStateChange(event) {
- // Get the instance
- var instance = event.target;
-
- // Reset timer
- clearInterval(player.timers.playing);
-
- var seeked = player.media.seeking && [1, 2].includes(event.data);
-
- if (seeked) {
- // Unset seeking and fire seeked event
- player.media.seeking = false;
- triggerEvent.call(player, player.media, 'seeked');
- }
-
- // Handle events
- // -1 Unstarted
- // 0 Ended
- // 1 Playing
- // 2 Paused
- // 3 Buffering
- // 5 Video cued
- switch (event.data) {
- case -1:
- // Update scrubber
- triggerEvent.call(player, player.media, 'timeupdate');
-
- // Get loaded % from YouTube
- player.media.buffered = instance.getVideoLoadedFraction();
- triggerEvent.call(player, player.media, 'progress');
-
- break;
-
- case 0:
- assurePlaybackState$1.call(player, false);
-
- // YouTube doesn't support loop for a single video, so mimick it.
- if (player.media.loop) {
- // YouTube needs a call to `stopVideo` before playing again
- instance.stopVideo();
- instance.playVideo();
- } else {
- triggerEvent.call(player, player.media, 'ended');
- }
-
- break;
-
- case 1:
- // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
- if (player.media.paused && !player.embed.hasPlayed) {
- player.media.pause();
- } else {
- assurePlaybackState$1.call(player, true);
-
- triggerEvent.call(player, player.media, 'playing');
-
- // Poll to get playback progress
- player.timers.playing = setInterval(function () {
- triggerEvent.call(player, player.media, 'timeupdate');
- }, 50);
-
- // Check duration again due to YouTube bug
- // https://github.com/sampotts/plyr/issues/374
- // https://code.google.com/p/gdata-issues/issues/detail?id=8690
- if (player.media.duration !== instance.getDuration()) {
- player.media.duration = instance.getDuration();
- triggerEvent.call(player, player.media, 'durationchange');
- }
- }
-
- break;
-
- case 2:
- // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
- if (!player.muted) {
- player.embed.unMute();
- }
- assurePlaybackState$1.call(player, false);
-
- break;
-
- default:
- break;
- }
-
- triggerEvent.call(player, player.elements.container, 'statechange', false, {
- code: event.data
- });
- }
- }
- });
- }
- };
-
- // ==========================================================================
-
- var media = {
- // Setup media
- setup: function setup() {
- // If there's no media, bail
- if (!this.media) {
- this.debug.warn('No media element found!');
- return;
- }
-
- // Add type class
- toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);
-
- // Add provider class
- toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);
-
- // Add video class for embeds
- // This will require changes if audio embeds are added
- if (this.isEmbed) {
- toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
- }
-
- // Inject the player wrapper
- if (this.isVideo) {
- // Create the wrapper div
- this.elements.wrapper = createElement('div', {
- class: this.config.classNames.video
- });
-
- // Wrap the video in a container
- wrap$2(this.media, this.elements.wrapper);
-
- // Faux poster container
- this.elements.poster = createElement('div', {
- class: this.config.classNames.poster
- });
-
- this.elements.wrapper.appendChild(this.elements.poster);
- }
-
- if (this.isHTML5) {
- html5.extend.call(this);
- } else if (this.isYouTube) {
- youtube.setup.call(this);
- } else if (this.isVimeo) {
- vimeo.setup.call(this);
- }
- }
- };
-
- // ==========================================================================
-
- var Ads = function () {
- /**
- * Ads constructor.
- * @param {object} player
- * @return {Ads}
- */
- function Ads(player) {
- var _this = this;
-
- classCallCheck(this, Ads);
-
- this.player = player;
- this.publisherId = player.config.ads.publisherId;
- this.playing = false;
- this.initialized = false;
- this.elements = {
- container: null,
- displayContainer: null
- };
- this.manager = null;
- this.loader = null;
- this.cuePoints = null;
- this.events = {};
- this.safetyTimer = null;
- this.countdownTimer = null;
-
- // Setup a promise to resolve when the IMA manager is ready
- this.managerPromise = new Promise(function (resolve, reject) {
- // The ad is loaded and ready
- _this.on('loaded', resolve);
-
- // Ads failed
- _this.on('error', reject);
- });
-
- this.load();
- }
-
- createClass(Ads, [{
- key: 'load',
-
-
- /**
- * Load the IMA SDK
- */
- value: function load() {
- var _this2 = this;
-
- if (this.enabled) {
- // Check if the Google IMA3 SDK is loaded or load it ourselves
- if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {
- loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
- _this2.ready();
- }).catch(function () {
- // Script failed to load or is blocked
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
- });
- } else {
- this.ready();
- }
- }
- }
-
- /**
- * Get the ads instance ready
- */
-
- }, {
- key: 'ready',
- value: function ready$$1() {
- var _this3 = this;
-
- // Start ticking our safety timer. If the whole advertisement
- // thing doesn't resolve within our set time; we bail
- this.startSafetyTimer(12000, 'ready()');
-
- // Clear the safety timer
- this.managerPromise.then(function () {
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
- });
-
- // Set listeners on the Plyr instance
- this.listeners();
-
- // Setup the IMA SDK
- this.setupIMA();
- }
-
- // Build the default tag URL
-
- }, {
- key: 'setupIMA',
-
-
- /**
- * In order for the SDK to display ads for our video, we need to tell it where to put them,
- * so here we define our ad container. This div is set up to render on top of the video player.
- * Using the code below, we tell the SDK to render ads within that div. We also provide a
- * handle to the content video player - the SDK will poll the current time of our player to
- * properly place mid-rolls. After we create the ad display container, we initialize it. On
- * mobile devices, this initialization is done as the result of a user action.
- */
- value: function setupIMA() {
- // Create the container for our advertisements
- this.elements.container = createElement('div', {
- class: this.player.config.classNames.ads
- });
- this.player.elements.container.appendChild(this.elements.container);
-
- // So we can run VPAID2
- google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);
-
- // Set language
- google.ima.settings.setLocale(this.player.config.ads.language);
-
- // We assume the adContainer is the video container of the plyr element
- // that will house the ads
- this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);
-
- // Request video ads to be pre-loaded
- this.requestAds();
- }
-
- /**
- * Request advertisements
- */
-
- }, {
- key: 'requestAds',
- value: function requestAds() {
- var _this4 = this;
-
- var container = this.player.elements.container;
-
-
- try {
- // Create ads loader
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer);
-
- // Listen and respond to ads loaded and error events
- this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
- return _this4.onAdsManagerLoaded(event);
- }, false);
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this4.onAdError(error);
- }, false);
-
- // Request video ads
- var request = new google.ima.AdsRequest();
- request.adTagUrl = this.tagUrl;
-
- // Specify the linear and nonlinear slot sizes. This helps the SDK
- // to select the correct creative if multiple are returned
- request.linearAdSlotWidth = container.offsetWidth;
- request.linearAdSlotHeight = container.offsetHeight;
- request.nonLinearAdSlotWidth = container.offsetWidth;
- request.nonLinearAdSlotHeight = container.offsetHeight;
-
- // We only overlay ads as we only support video.
- request.forceNonLinearFullSlot = false;
-
- // Mute based on current state
- request.setAdWillPlayMuted(!this.player.muted);
-
- this.loader.requestAds(request);
- } catch (e) {
- this.onAdError(e);
- }
- }
-
- /**
- * Update the ad countdown
- * @param {boolean} start
- */
-
- }, {
- key: 'pollCountdown',
- value: function pollCountdown() {
- var _this5 = this;
-
- var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- if (!start) {
- clearInterval(this.countdownTimer);
- this.elements.container.removeAttribute('data-badge-text');
- return;
- }
-
- var update = function update() {
- var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
- var label = i18n.get('advertisement', _this5.player.config) + ' - ' + time;
- _this5.elements.container.setAttribute('data-badge-text', label);
- };
-
- this.countdownTimer = setInterval(update, 100);
- }
-
- /**
- * This method is called whenever the ads are ready inside the AdDisplayContainer
- * @param {Event} adsManagerLoadedEvent
- */
-
- }, {
- key: 'onAdsManagerLoaded',
- value: function onAdsManagerLoaded(event) {
- var _this6 = this;
-
- // Load could occur after a source change (race condition)
- if (!this.enabled) {
- return;
- }
-
- // Get the ads manager
- var settings = new google.ima.AdsRenderingSettings();
-
- // Tell the SDK to save and restore content video state on our behalf
- settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
- settings.enablePreloading = true;
-
- // The SDK is polling currentTime on the contentPlayback. And needs a duration
- // so it can determine when to start the mid- and post-roll
- this.manager = event.getAdsManager(this.player, settings);
-
- // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
- this.cuePoints = this.manager.getCuePoints();
-
- // Add advertisement cue's within the time line if available
- if (!is$1.empty(this.cuePoints)) {
- this.cuePoints.forEach(function (cuePoint) {
- if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this6.player.duration) {
- var seekElement = _this6.player.elements.progress;
-
- if (is$1.element(seekElement)) {
- var cuePercentage = 100 / _this6.player.duration * cuePoint;
- var cue = createElement('span', {
- class: _this6.player.config.classNames.cues
- });
-
- cue.style.left = cuePercentage.toString() + '%';
- seekElement.appendChild(cue);
- }
- }
- });
- }
-
- // Set volume to match player
- this.manager.setVolume(this.player.volume);
-
- // Add listeners to the required events
- // Advertisement error events
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this6.onAdError(error);
- });
-
- // Advertisement regular events
- Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {
- return _this6.onAdEvent(event);
- });
- });
-
- // Resolve our adsManager
- this.trigger('loaded');
- }
-
- /**
- * This is where all the event handling takes place. Retrieve the ad from the event. Some
- * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
- * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
- * @param {Event} event
- */
-
- }, {
- key: 'onAdEvent',
- value: function onAdEvent(event) {
- var _this7 = this;
-
- var container = this.player.elements.container;
-
- // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
- // don't have ad object associated
-
- var ad = event.getAd();
-
- // Proxy event
- var dispatchEvent = function dispatchEvent(type) {
- var event = 'ads' + type.replace(/_/g, '').toLowerCase();
- triggerEvent.call(_this7.player, _this7.player.media, event);
- };
-
- switch (event.type) {
- case google.ima.AdEvent.Type.LOADED:
- // This is the first event sent for an ad - it is possible to determine whether the
- // ad is a video ad or an overlay
- this.trigger('loaded');
-
- // Bubble event
- dispatchEvent(event.type);
-
- // Start countdown
- this.pollCountdown(true);
-
- if (!ad.isLinear()) {
- // Position AdDisplayContainer correctly for overlay
- ad.width = container.offsetWidth;
- ad.height = container.offsetHeight;
- }
-
- // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
- // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
- break;
-
- case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
- // All ads for the current videos are done. We can now request new advertisements
- // in case the video is re-played
-
- // Fire event
- dispatchEvent(event.type);
-
- // TODO: Example for what happens when a next video in a playlist would be loaded.
- // So here we load a new video when all ads are done.
- // Then we load new ads within a new adsManager. When the video
- // Is started - after - the ads are loaded, then we get ads.
- // You can also easily test cancelling and reloading by running
- // player.ads.cancel() and player.ads.play from the console I guess.
- // this.player.source = {
- // type: 'video',
- // title: 'View From A Blue Moon',
- // sources: [{
- // src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
- // 'video/mp4', }], poster:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
- // [ { kind: 'captions', label: 'English', srclang: 'en', src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
- // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
- // };
-
- // TODO: So there is still this thing where a video should only be allowed to start
- // playing when the IMA SDK is ready or has failed
-
- this.loadAds();
- break;
-
- case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
- // This event indicates the ad has started - the video player can adjust the UI,
- // for example display a pause button and remaining time. Fired when content should
- // be paused. This usually happens right before an ad is about to cover the content
-
- dispatchEvent(event.type);
-
- this.pauseContent();
-
- break;
-
- case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
- // This event indicates the ad has finished - the video player can perform
- // appropriate UI actions, such as removing the timer for remaining time detection.
- // Fired when content should be resumed. This usually happens when an ad finishes
- // or collapses
-
- dispatchEvent(event.type);
-
- this.pollCountdown();
-
- this.resumeContent();
-
- break;
-
- case google.ima.AdEvent.Type.STARTED:
- case google.ima.AdEvent.Type.MIDPOINT:
- case google.ima.AdEvent.Type.COMPLETE:
- case google.ima.AdEvent.Type.IMPRESSION:
- case google.ima.AdEvent.Type.CLICK:
- dispatchEvent(event.type);
- break;
-
- default:
- break;
- }
- }
-
- /**
- * Any ad error handling comes through here
- * @param {Event} event
- */
-
- }, {
- key: 'onAdError',
- value: function onAdError(event) {
- this.cancel();
- this.player.debug.warn('Ads error', event);
- }
-
- /**
- * Setup hooks for Plyr and window events. This ensures
- * the mid- and post-roll launch at the correct time. And
- * resize the advertisement when the player resizes
- */
-
- }, {
- key: 'listeners',
- value: function listeners() {
- var _this8 = this;
-
- var container = this.player.elements.container;
-
- var time = void 0;
-
- // Add listeners to the required events
- this.player.on('ended', function () {
- _this8.loader.contentComplete();
- });
-
- this.player.on('seeking', function () {
- time = _this8.player.currentTime;
- return time;
- });
-
- this.player.on('seeked', function () {
- var seekedTime = _this8.player.currentTime;
-
- if (is$1.empty(_this8.cuePoints)) {
- return;
- }
-
- _this8.cuePoints.forEach(function (cuePoint, index) {
- if (time < cuePoint && cuePoint < seekedTime) {
- _this8.manager.discardAdBreak();
- _this8.cuePoints.splice(index, 1);
- }
- });
- });
-
- // Listen to the resizing of the window. And resize ad accordingly
- // TODO: eventually implement ResizeObserver
- window.addEventListener('resize', function () {
- if (_this8.manager) {
- _this8.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
- }
- });
- }
-
- /**
- * Initialize the adsManager and start playing advertisements
- */
-
- }, {
- key: 'play',
- value: function play() {
- var _this9 = this;
-
- var container = this.player.elements.container;
-
-
- if (!this.managerPromise) {
- this.resumeContent();
- }
-
- // Play the requested advertisement whenever the adsManager is ready
- this.managerPromise.then(function () {
- // Initialize the container. Must be done via a user action on mobile devices
- _this9.elements.displayContainer.initialize();
-
- try {
- if (!_this9.initialized) {
- // Initialize the ads manager. Ad rules playlist will start at this time
- _this9.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
-
- // Call play to start showing the ad. Single video and overlay ads will
- // start at this time; the call will be ignored for ad rules
- _this9.manager.start();
- }
-
- _this9.initialized = true;
- } catch (adError) {
- // An error may be thrown if there was a problem with the
- // VAST response
- _this9.onAdError(adError);
- }
- }).catch(function () {});
- }
-
- /**
- * Resume our video
- */
-
- }, {
- key: 'resumeContent',
- value: function resumeContent() {
- // Hide the advertisement container
- this.elements.container.style.zIndex = '';
-
- // Ad is stopped
- this.playing = false;
-
- // Play our video
- if (this.player.currentTime < this.player.duration) {
- this.player.play();
- }
- }
-
- /**
- * Pause our video
- */
-
- }, {
- key: 'pauseContent',
- value: function pauseContent() {
- // Show the advertisement container
- this.elements.container.style.zIndex = 3;
-
- // Ad is playing.
- this.playing = true;
-
- // Pause our video.
- this.player.pause();
- }
-
- /**
- * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
- * allowed to call new ads based on google policies, as they interpret this as an accidental
- * video requests. https://developers.google.com/interactive-
- * media-ads/docs/sdks/android/faq#8
- */
-
- }, {
- key: 'cancel',
- value: function cancel() {
- // Pause our video
- if (this.initialized) {
- this.resumeContent();
- }
-
- // Tell our instance that we're done for now
- this.trigger('error');
-
- // Re-create our adsManager
- this.loadAds();
- }
-
- /**
- * Re-create our adsManager
- */
-
- }, {
- key: 'loadAds',
- value: function loadAds() {
- var _this10 = this;
-
- // Tell our adsManager to go bye bye
- this.managerPromise.then(function () {
- // Destroy our adsManager
- if (_this10.manager) {
- _this10.manager.destroy();
- }
-
- // Re-set our adsManager promises
- _this10.managerPromise = new Promise(function (resolve) {
- _this10.on('loaded', resolve);
- _this10.player.debug.log(_this10.manager);
- });
-
- // Now request some new advertisements
- _this10.requestAds();
- }).catch(function () {});
- }
-
- /**
- * Handles callbacks after an ad event was invoked
- * @param {string} event - Event type
- */
-
- }, {
- key: 'trigger',
- value: function trigger(event) {
- var _this11 = this;
-
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
-
- var handlers = this.events[event];
-
- if (is$1.array(handlers)) {
- handlers.forEach(function (handler) {
- if (is$1.function(handler)) {
- handler.apply(_this11, args);
- }
- });
- }
- }
-
- /**
- * Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- * @return {Ads}
- */
-
- }, {
- key: 'on',
- value: function on$$1(event, callback) {
- if (!is$1.array(this.events[event])) {
- this.events[event] = [];
- }
-
- this.events[event].push(callback);
-
- return this;
- }
-
- /**
- * Setup a safety timer for when the ad network doesn't respond for whatever reason.
- * The advertisement has 12 seconds to get its things together. We stop this timer when the
- * advertisement is playing, or when a user action is required to start, then we clear the
- * timer on ad ready
- * @param {number} time
- * @param {string} from
- */
-
- }, {
- key: 'startSafetyTimer',
- value: function startSafetyTimer(time, from) {
- var _this12 = this;
-
- this.player.debug.log('Safety timer invoked from: ' + from);
-
- this.safetyTimer = setTimeout(function () {
- _this12.cancel();
- _this12.clearSafetyTimer('startSafetyTimer()');
- }, time);
- }
-
- /**
- * Clear our safety timer(s)
- * @param {string} from
- */
-
- }, {
- key: 'clearSafetyTimer',
- value: function clearSafetyTimer(from) {
- if (!is$1.nullOrUndefined(this.safetyTimer)) {
- this.player.debug.log('Safety timer cleared from: ' + from);
-
- clearTimeout(this.safetyTimer);
- this.safetyTimer = null;
- }
- }
- }, {
- key: 'enabled',
- get: function get() {
- return this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is$1.empty(this.publisherId);
- }
- }, {
- key: 'tagUrl',
- get: function get() {
- var params = {
- AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
- AV_CHANNELID: '5a0458dc28a06145e4519d21',
- AV_URL: window.location.hostname,
- cb: Date.now(),
- AV_WIDTH: 640,
- AV_HEIGHT: 480,
- AV_CDIM2: this.publisherId
- };
-
- var base = 'https://go.aniview.com/api/adserver6/vast/';
-
- return base + '?' + buildUrlParams(params);
- }
- }]);
- return Ads;
- }();
-
- // ==========================================================================
-
- var source = {
- // Add elements to HTML5 media (source, tracks, etc)
- insertElements: function insertElements(type, attributes) {
- var _this = this;
-
- if (is$1.string(attributes)) {
- insertElement(type, this.media, {
- src: attributes
- });
- } else if (is$1.array(attributes)) {
- attributes.forEach(function (attribute) {
- insertElement(type, _this.media, attribute);
- });
- }
- },
-
-
- // Update source
- // Sources are not checked for support so be careful
- change: function change(input) {
- var _this2 = this;
-
- if (!getDeep(input, 'sources.length')) {
- this.debug.warn('Invalid source format');
- return;
- }
-
- // Cancel current network requests
- html5.cancelRequests.call(this);
-
- // Destroy instance and re-setup
- this.destroy.call(this, function () {
- // Reset quality options
- _this2.options.quality = [];
-
- // Remove elements
- removeElement(_this2.media);
- _this2.media = null;
-
- // Reset class name
- if (is$1.element(_this2.elements.container)) {
- _this2.elements.container.removeAttribute('class');
- }
-
- // Set the type and provider
- var sources = input.sources,
- type = input.type;
-
- var _sources = slicedToArray(sources, 1),
- _sources$ = _sources[0],
- _sources$$provider = _sources$.provider,
- provider = _sources$$provider === undefined ? providers.html5 : _sources$$provider,
- src = _sources$.src;
-
- var tagName = provider === 'html5' ? type : 'div';
- var attributes = provider === 'html5' ? {} : { src: src };
-
- Object.assign(_this2, {
- provider: provider,
- type: type,
- // Check for support
- supported: support.check(type, provider, _this2.config.playsinline),
- // Create new element
- media: createElement(tagName, attributes)
- });
-
- // Inject the new element
- _this2.elements.container.appendChild(_this2.media);
-
- // Autoplay the new source?
- if (is$1.boolean(input.autoplay)) {
- _this2.config.autoplay = input.autoplay;
- }
-
- // Set attributes for audio and video
- if (_this2.isHTML5) {
- if (_this2.config.crossorigin) {
- _this2.media.setAttribute('crossorigin', '');
- }
- if (_this2.config.autoplay) {
- _this2.media.setAttribute('autoplay', '');
- }
- if (!is$1.empty(input.poster)) {
- _this2.poster = input.poster;
- }
- if (_this2.config.loop.active) {
- _this2.media.setAttribute('loop', '');
- }
- if (_this2.config.muted) {
- _this2.media.setAttribute('muted', '');
- }
- if (_this2.config.playsinline) {
- _this2.media.setAttribute('playsinline', '');
- }
- }
-
- // Restore class hook
- ui.addStyleHook.call(_this2);
-
- // Set new sources for html5
- if (_this2.isHTML5) {
- source.insertElements.call(_this2, 'source', sources);
- }
-
- // Set video title
- _this2.config.title = input.title;
-
- // Set up from scratch
- media.setup.call(_this2);
-
- // HTML5 stuff
- if (_this2.isHTML5) {
- // Setup captions
- if ('tracks' in input) {
- source.insertElements.call(_this2, 'track', input.tracks);
- }
-
- // Load HTML5 sources
- _this2.media.load();
- }
-
- // If HTML5 or embed but not fully supported, setupInterface and call ready now
- if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
- // Setup interface
- ui.build.call(_this2);
- }
-
- // Update the fullscreen support
- _this2.fullscreen.update();
- }, true);
- }
- };
-
- // ==========================================================================
-
- // Private properties
- // TODO: Use a WeakMap for private globals
- // const globals = new WeakMap();
-
- // Plyr instance
-
- var Plyr = function () {
- function Plyr(target, options) {
- var _this = this;
-
- classCallCheck(this, Plyr);
-
- this.timers = {};
-
- // State
- this.ready = false;
- this.loading = false;
- this.failed = false;
-
- // Touch device
- this.touch = support.touch;
-
- // Set the media element
- this.media = target;
-
- // String selector passed
- if (is$1.string(this.media)) {
- this.media = document.querySelectorAll(this.media);
- }
-
- // jQuery, NodeList or Array passed, use first element
- if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {
- // eslint-disable-next-line
- this.media = this.media[0];
- }
-
- // Set config
- this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {
- try {
- return JSON.parse(_this.media.getAttribute('data-plyr-config'));
- } catch (e) {
- return {};
- }
- }());
-
- // Elements cache
- this.elements = {
- container: null,
- captions: null,
- buttons: {},
- display: {},
- progress: {},
- inputs: {},
- settings: {
- popup: null,
- menu: null,
- panels: {},
- buttons: {}
- }
- };
-
- // Captions
- this.captions = {
- active: null,
- currentTrack: -1,
- meta: new WeakMap()
- };
-
- // Fullscreen
- this.fullscreen = {
- active: false
- };
-
- // Options
- this.options = {
- speed: [],
- quality: []
- };
-
- // Debugging
- // TODO: move to globals
- this.debug = new Console(this.config.debug);
-
- // Log config options and support
- this.debug.log('Config', this.config);
- this.debug.log('Support', support);
-
- // We need an element to setup
- if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {
- this.debug.error('Setup failed: no suitable element passed');
- return;
- }
-
- // Bail if the element is initialized
- if (this.media.plyr) {
- this.debug.warn('Target already setup');
- return;
- }
-
- // Bail if not enabled
- if (!this.config.enabled) {
- this.debug.error('Setup failed: disabled by config');
- return;
- }
-
- // Bail if disabled or no basic support
- // You may want to disable certain UAs etc
- if (!support.check().api) {
- this.debug.error('Setup failed: no support');
- return;
- }
-
- // Cache original element state for .destroy()
- var clone = this.media.cloneNode(true);
- clone.autoplay = false;
- this.elements.original = clone;
-
- // Set media type based on tag or data attribute
- // Supported: video, audio, vimeo, youtube
- var type = this.media.tagName.toLowerCase();
-
- // Embed properties
- var iframe = null;
- var url = null;
-
- // Different setup based on type
- switch (type) {
- case 'div':
- // Find the frame
- iframe = this.media.querySelector('iframe');
-
- // <iframe> type
- if (is$1.element(iframe)) {
- // Detect provider
- url = parseUrl(iframe.getAttribute('src'));
- this.provider = getProviderByUrl(url.toString());
-
- // Rework elements
- this.elements.container = this.media;
- this.media = iframe;
-
- // Reset classname
- this.elements.container.className = '';
-
- // Get attributes from URL and set config
- if (url.search.length) {
- var truthy = ['1', 'true'];
-
- if (truthy.includes(url.searchParams.get('autoplay'))) {
- this.config.autoplay = true;
- }
- if (truthy.includes(url.searchParams.get('loop'))) {
- this.config.loop.active = true;
- }
-
- // TODO: replace fullscreen.iosNative with this playsinline config option
- // YouTube requires the playsinline in the URL
- if (this.isYouTube) {
- this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
- this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?
- } else {
- this.config.playsinline = true;
- }
- }
- } else {
- // <div> with attributes
- this.provider = this.media.getAttribute(this.config.attributes.embed.provider);
-
- // Remove attribute
- this.media.removeAttribute(this.config.attributes.embed.provider);
- }
-
- // Unsupported or missing provider
- if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
- this.debug.error('Setup failed: Invalid provider');
- return;
- }
-
- // Audio will come later for external providers
- this.type = types.video;
-
- break;
-
- case 'video':
- case 'audio':
- this.type = type;
- this.provider = providers.html5;
-
- // Get config from attributes
- if (this.media.hasAttribute('crossorigin')) {
- this.config.crossorigin = true;
- }
- if (this.media.hasAttribute('autoplay')) {
- this.config.autoplay = true;
- }
- if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {
- this.config.playsinline = true;
- }
- if (this.media.hasAttribute('muted')) {
- this.config.muted = true;
- }
- if (this.media.hasAttribute('loop')) {
- this.config.loop.active = true;
- }
-
- break;
-
- default:
- this.debug.error('Setup failed: unsupported type');
- return;
- }
-
- // Check for support again but with type
- this.supported = support.check(this.type, this.provider, this.config.playsinline);
-
- // If no support for even API, bail
- if (!this.supported.api) {
- this.debug.error('Setup failed: no support');
- return;
- }
-
- this.eventListeners = [];
-
- // Create listeners
- this.listeners = new Listeners(this);
-
- // Setup local storage for user settings
- this.storage = new Storage(this);
-
- // Store reference
- this.media.plyr = this;
-
- // Wrap media
- if (!is$1.element(this.elements.container)) {
- this.elements.container = createElement('div');
- wrap$2(this.media, this.elements.container);
- }
-
- // Add style hook
- ui.addStyleHook.call(this);
-
- // Setup media
- media.setup.call(this);
-
- // Listen for events if debugging
- if (this.config.debug) {
- on.call(this, this.elements.container, this.config.events.join(' '), function (event) {
- _this.debug.log('event: ' + event.type);
- });
- }
-
- // Setup interface
- // If embed but not fully supported, build interface now to avoid flash of controls
- if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
- ui.build.call(this);
- }
-
- // Container listeners
- this.listeners.container();
-
- // Global listeners
- this.listeners.global();
-
- // Setup fullscreen
- this.fullscreen = new Fullscreen(this);
-
- // Setup ads if provided
- if (this.config.ads.enabled) {
- this.ads = new Ads(this);
- }
-
- // Autoplay if required
- if (this.config.autoplay) {
- this.play();
- }
- }
-
- // ---------------------------------------
- // API
- // ---------------------------------------
-
- /**
- * Types and provider helpers
- */
-
-
- createClass(Plyr, [{
- key: 'play',
-
-
- /**
- * Play the media, or play the advertisement (if they are not blocked)
- */
- value: function play() {
- if (!is$1.function(this.media.play)) {
- return null;
- }
-
- // Return the promise (for HTML5)
- return this.media.play();
- }
-
- /**
- * Pause the media
- */
-
- }, {
- key: 'pause',
- value: function pause() {
- if (!this.playing || !is$1.function(this.media.pause)) {
- return;
- }
-
- this.media.pause();
- }
-
- /**
- * Get playing state
- */
-
- }, {
- key: 'togglePlay',
-
-
- /**
- * Toggle playback based on current status
- * @param {boolean} input
- */
- value: function togglePlay(input) {
- // Toggle based on current state if nothing passed
- var toggle = is$1.boolean(input) ? input : !this.playing;
-
- if (toggle) {
- this.play();
- } else {
- this.pause();
- }
- }
-
- /**
- * Stop playback
- */
-
- }, {
- key: 'stop',
- value: function stop() {
- if (this.isHTML5) {
- this.pause();
- this.restart();
- } else if (is$1.function(this.media.stop)) {
- this.media.stop();
- }
- }
-
- /**
- * Restart playback
- */
-
- }, {
- key: 'restart',
- value: function restart() {
- this.currentTime = 0;
- }
-
- /**
- * Rewind
- * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
- */
-
- }, {
- key: 'rewind',
- value: function rewind(seekTime) {
- this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime);
- }
-
- /**
- * Fast forward
- * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
- */
-
- }, {
- key: 'forward',
- value: function forward(seekTime) {
- this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime);
- }
-
- /**
- * Seek to a time
- * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)
- */
-
- }, {
- key: 'increaseVolume',
-
-
- /**
- * Increase volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
- */
- value: function increaseVolume(step) {
- var volume = this.media.muted ? 0 : this.volume;
- this.volume = volume + (is$1.number(step) ? step : 0);
- }
-
- /**
- * Decrease volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
- */
-
- }, {
- key: 'decreaseVolume',
- value: function decreaseVolume(step) {
- this.increaseVolume(-step);
- }
-
- /**
- * Set muted state
- * @param {boolean} mute
- */
-
- }, {
- key: 'toggleCaptions',
-
-
- /**
- * Toggle captions
- * @param {boolean} input - Whether to enable captions
- */
- value: function toggleCaptions(input) {
- captions.toggle.call(this, input, false);
- }
-
- /**
- * Set the caption track by index
- * @param {number} - Caption index
- */
-
- }, {
- key: 'airplay',
-
-
- /**
- * Trigger the airplay dialog
- * TODO: update player with state, support, enabled
- */
- value: function airplay() {
- // Show dialog if supported
- if (support.airplay) {
- this.media.webkitShowPlaybackTargetPicker();
- }
- }
-
- /**
- * Toggle the player controls
- * @param {boolean} [toggle] - Whether to show the controls
- */
-
- }, {
- key: 'toggleControls',
- value: function toggleControls(toggle) {
- // Don't toggle if missing UI support or if it's audio
- if (this.supported.ui && !this.isAudio) {
- // Get state before change
- var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);
-
- // Negate the argument if not undefined since adding the class to hides the controls
- var force = typeof toggle === 'undefined' ? undefined : !toggle;
-
- // Apply and get updated state
- var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);
-
- // Close menu
- if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {
- controls.toggleMenu.call(this, false);
- }
-
- // Trigger event on change
- if (hiding !== isHidden) {
- var eventName = hiding ? 'controlshidden' : 'controlsshown';
- triggerEvent.call(this, this.media, eventName);
- }
-
- return !hiding;
- }
-
- return false;
- }
-
- /**
- * Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
-
- }, {
- key: 'on',
- value: function on$$1(event, callback) {
- on.call(this, this.elements.container, event, callback);
- }
-
- /**
- * Add event listeners once
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
-
- }, {
- key: 'once',
- value: function once$$1(event, callback) {
- once.call(this, this.elements.container, event, callback);
- }
-
- /**
- * Remove event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
-
- }, {
- key: 'off',
- value: function off$$1(event, callback) {
- off(this.elements.container, event, callback);
- }
-
- /**
- * Destroy an instance
- * Event listeners are removed when elements are removed
- * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
- * @param {function} callback - Callback for when destroy is complete
- * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)
- */
-
- }, {
- key: 'destroy',
- value: function destroy(callback) {
- var _this2 = this;
-
- var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- if (!this.ready) {
- return;
- }
-
- var done = function done() {
- // Reset overflow (incase destroyed while in fullscreen)
- document.body.style.overflow = '';
-
- // GC for embed
- _this2.embed = null;
-
- // If it's a soft destroy, make minimal changes
- if (soft) {
- if (Object.keys(_this2.elements).length) {
- // Remove elements
- removeElement(_this2.elements.buttons.play);
- removeElement(_this2.elements.captions);
- removeElement(_this2.elements.controls);
- removeElement(_this2.elements.wrapper);
-
- // Clear for GC
- _this2.elements.buttons.play = null;
- _this2.elements.captions = null;
- _this2.elements.controls = null;
- _this2.elements.wrapper = null;
- }
-
- // Callback
- if (is$1.function(callback)) {
- callback();
- }
- } else {
- // Unbind listeners
- unbindListeners.call(_this2);
-
- // Replace the container with the original element provided
- replaceElement(_this2.elements.original, _this2.elements.container);
-
- // Event
- triggerEvent.call(_this2, _this2.elements.original, 'destroyed', true);
-
- // Callback
- if (is$1.function(callback)) {
- callback.call(_this2.elements.original);
- }
-
- // Reset state
- _this2.ready = false;
-
- // Clear for garbage collection
- setTimeout(function () {
- _this2.elements = null;
- _this2.media = null;
- }, 200);
- }
- };
-
- // Stop playback
- this.stop();
-
- // Provider specific stuff
- if (this.isHTML5) {
- // Clear timeout
- clearTimeout(this.timers.loading);
-
- // Restore native video controls
- ui.toggleNativeControls.call(this, true);
-
- // Clean up
- done();
- } else if (this.isYouTube) {
- // Clear timers
- clearInterval(this.timers.buffering);
- clearInterval(this.timers.playing);
-
- // Destroy YouTube API
- if (this.embed !== null && is$1.function(this.embed.destroy)) {
- this.embed.destroy();
- }
-
- // Clean up
- done();
- } else if (this.isVimeo) {
- // Destroy Vimeo API
- // then clean up (wait, to prevent postmessage errors)
- if (this.embed !== null) {
- this.embed.unload().then(done);
- }
-
- // Vimeo does not always return
- setTimeout(done, 200);
- }
- }
-
- /**
- * Check for support for a mime type (HTML5 only)
- * @param {string} type - Mime type
- */
-
- }, {
- key: 'supports',
- value: function supports(type) {
- return support.mime.call(this, type);
- }
-
- /**
- * Check for support
- * @param {string} type - Player type (audio/video)
- * @param {string} provider - Provider (html5/youtube/vimeo)
- * @param {bool} inline - Where player has `playsinline` sttribute
- */
-
- }, {
- key: 'isHTML5',
- get: function get() {
- return Boolean(this.provider === providers.html5);
- }
- }, {
- key: 'isEmbed',
- get: function get() {
- return Boolean(this.isYouTube || this.isVimeo);
- }
- }, {
- key: 'isYouTube',
- get: function get() {
- return Boolean(this.provider === providers.youtube);
- }
- }, {
- key: 'isVimeo',
- get: function get() {
- return Boolean(this.provider === providers.vimeo);
- }
- }, {
- key: 'isVideo',
- get: function get() {
- return Boolean(this.type === types.video);
- }
- }, {
- key: 'isAudio',
- get: function get() {
- return Boolean(this.type === types.audio);
- }
- }, {
- key: 'playing',
- get: function get() {
- return Boolean(this.ready && !this.paused && !this.ended);
- }
-
- /**
- * Get paused state
- */
-
- }, {
- key: 'paused',
- get: function get() {
- return Boolean(this.media.paused);
- }
-
- /**
- * Get stopped state
- */
-
- }, {
- key: 'stopped',
- get: function get() {
- return Boolean(this.paused && this.currentTime === 0);
- }
-
- /**
- * Get ended state
- */
-
- }, {
- key: 'ended',
- get: function get() {
- return Boolean(this.media.ended);
- }
- }, {
- key: 'currentTime',
- set: function set(input) {
- // Bail if media duration isn't available yet
- if (!this.duration) {
- return;
- }
-
- // Validate input
- var inputIsValid = is$1.number(input) && input > 0;
-
- // Set
- this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;
-
- // Logging
- this.debug.log('Seeking to ' + this.currentTime + ' seconds');
- }
-
- /**
- * Get current time
- */
- ,
- get: function get() {
- return Number(this.media.currentTime);
- }
-
- /**
- * Get buffered
- */
-
- }, {
- key: 'buffered',
- get: function get() {
- var buffered = this.media.buffered;
-
- // YouTube / Vimeo return a float between 0-1
-
- if (is$1.number(buffered)) {
- return buffered;
- }
-
- // HTML5
- // TODO: Handle buffered chunks of the media
- // (i.e. seek to another section buffers only that section)
- if (buffered && buffered.length && this.duration > 0) {
- return buffered.end(0) / this.duration;
- }
-
- return 0;
- }
-
- /**
- * Get seeking status
- */
-
- }, {
- key: 'seeking',
- get: function get() {
- return Boolean(this.media.seeking);
- }
-
- /**
- * Get the duration of the current media
- */
-
- }, {
- key: 'duration',
- get: function get() {
- // Faux duration set via config
- var fauxDuration = parseFloat(this.config.duration);
-
- // Media duration can be NaN or Infinity before the media has loaded
- var realDuration = (this.media || {}).duration;
- var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration;
-
- // If config duration is funky, use regular duration
- return fauxDuration || duration;
- }
-
- /**
- * Set the player volume
- * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
- */
-
- }, {
- key: 'volume',
- set: function set(value) {
- var volume = value;
- var max = 1;
- var min = 0;
-
- if (is$1.string(volume)) {
- volume = Number(volume);
- }
-
- // Load volume from storage if no value specified
- if (!is$1.number(volume)) {
- volume = this.storage.get('volume');
- }
-
- // Use config if all else fails
- if (!is$1.number(volume)) {
- volume = this.config.volume;
- }
-
- // Maximum is volumeMax
- if (volume > max) {
- volume = max;
- }
- // Minimum is volumeMin
- if (volume < min) {
- volume = min;
- }
-
- // Update config
- this.config.volume = volume;
-
- // Set the player volume
- this.media.volume = volume;
-
- // If muted, and we're increasing volume manually, reset muted state
- if (!is$1.empty(value) && this.muted && volume > 0) {
- this.muted = false;
- }
- }
-
- /**
- * Get the current player volume
- */
- ,
- get: function get() {
- return Number(this.media.volume);
- }
- }, {
- key: 'muted',
- set: function set(mute) {
- var toggle = mute;
-
- // Load muted state from storage
- if (!is$1.boolean(toggle)) {
- toggle = this.storage.get('muted');
- }
-
- // Use config if all else fails
- if (!is$1.boolean(toggle)) {
- toggle = this.config.muted;
- }
-
- // Update config
- this.config.muted = toggle;
-
- // Set mute on the player
- this.media.muted = toggle;
- }
-
- /**
- * Get current muted state
- */
- ,
- get: function get() {
- return Boolean(this.media.muted);
- }
-
- /**
- * Check if the media has audio
- */
-
- }, {
- key: 'hasAudio',
- get: function get() {
- // Assume yes for all non HTML5 (as we can't tell...)
- if (!this.isHTML5) {
- return true;
- }
-
- if (this.isAudio) {
- return true;
- }
-
- // Get audio tracks
- return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
- }
-
- /**
- * Set playback speed
- * @param {number} speed - the speed of playback (0.5-2.0)
- */
-
- }, {
- key: 'speed',
- set: function set(input) {
- var speed = null;
-
- if (is$1.number(input)) {
- speed = input;
- }
-
- if (!is$1.number(speed)) {
- speed = this.storage.get('speed');
- }
-
- if (!is$1.number(speed)) {
- speed = this.config.speed.selected;
- }
-
- // Set min/max
- if (speed < 0.1) {
- speed = 0.1;
- }
- if (speed > 2.0) {
- speed = 2.0;
- }
-
- if (!this.config.speed.options.includes(speed)) {
- this.debug.warn('Unsupported speed (' + speed + ')');
- return;
- }
-
- // Update config
- this.config.speed.selected = speed;
-
- // Set media speed
- this.media.playbackRate = speed;
- }
-
- /**
- * Get current playback speed
- */
- ,
- get: function get() {
- return Number(this.media.playbackRate);
- }
-
- /**
- * Set playback quality
- * Currently HTML5 & YouTube only
- * @param {number} input - Quality level
- */
-
- }, {
- key: 'quality',
- set: function set(input) {
- var config = this.config.quality;
- var options = this.options.quality;
-
- if (!options.length) {
- return;
- }
-
- var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);
-
- if (!options.includes(quality)) {
- var value = closest(options, quality);
- this.debug.warn('Unsupported quality option: ' + quality + ', using ' + value + ' instead');
- quality = value;
- }
-
- // Update config
- config.selected = quality;
-
- // Set quality
- this.media.quality = quality;
- }
-
- /**
- * Get current quality level
- */
- ,
- get: function get() {
- return this.media.quality;
- }
-
- /**
- * Toggle loop
- * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
- * @param {boolean} input - Whether to loop or not
- */
-
- }, {
- key: 'loop',
- set: function set(input) {
- var toggle = is$1.boolean(input) ? input : this.config.loop.active;
- this.config.loop.active = toggle;
- this.media.loop = toggle;
-
- // Set default to be a true toggle
- /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
- switch (type) {
- case 'start':
- if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
- this.config.loop.end = null;
- }
- this.config.loop.start = this.currentTime;
- // this.config.loop.indicator.start = this.elements.display.played.value;
- break;
- case 'end':
- if (this.config.loop.start >= this.currentTime) {
- return this;
- }
- this.config.loop.end = this.currentTime;
- // this.config.loop.indicator.end = this.elements.display.played.value;
- break;
- case 'all':
- this.config.loop.start = 0;
- this.config.loop.end = this.duration - 2;
- this.config.loop.indicator.start = 0;
- this.config.loop.indicator.end = 100;
- break;
- case 'toggle':
- if (this.config.loop.active) {
- this.config.loop.start = 0;
- this.config.loop.end = null;
- } else {
- this.config.loop.start = 0;
- this.config.loop.end = this.duration - 2;
- }
- break;
- default:
- this.config.loop.start = 0;
- this.config.loop.end = null;
- break;
- } */
- }
-
- /**
- * Get current loop state
- */
- ,
- get: function get() {
- return Boolean(this.media.loop);
- }
-
- /**
- * Set new media source
- * @param {object} input - The new source object (see docs)
- */
-
- }, {
- key: 'source',
- set: function set(input) {
- source.change.call(this, input);
- }
-
- /**
- * Get current source
- */
- ,
- get: function get() {
- return this.media.currentSrc;
- }
-
- /**
- * Set the poster image for a video
- * @param {input} - the URL for the new poster image
- */
-
- }, {
- key: 'poster',
- set: function set(input) {
- if (!this.isVideo) {
- this.debug.warn('Poster can only be set for video');
- return;
- }
-
- ui.setPoster.call(this, input, false).catch(function () {});
- }
-
- /**
- * Get the current poster image
- */
- ,
- get: function get() {
- if (!this.isVideo) {
- return null;
- }
-
- return this.media.getAttribute('poster');
- }
-
- /**
- * Set the autoplay state
- * @param {boolean} input - Whether to autoplay or not
- */
-
- }, {
- key: 'autoplay',
- set: function set(input) {
- var toggle = is$1.boolean(input) ? input : this.config.autoplay;
- this.config.autoplay = toggle;
- }
-
- /**
- * Get the current autoplay state
- */
- ,
- get: function get() {
- return Boolean(this.config.autoplay);
- }
- }, {
- key: 'currentTrack',
- set: function set(input) {
- captions.set.call(this, input, false);
- }
-
- /**
- * Get the current caption track index (-1 if disabled)
- */
- ,
- get: function get() {
- var _captions = this.captions,
- toggled = _captions.toggled,
- currentTrack = _captions.currentTrack;
-
- return toggled ? currentTrack : -1;
- }
-
- /**
- * Set the wanted language for captions
- * Since tracks can be added later it won't update the actual caption track until there is a matching track
- * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
- */
-
- }, {
- key: 'language',
- set: function set(input) {
- captions.setLanguage.call(this, input, false);
- }
-
- /**
- * Get the current track's language
- */
- ,
- get: function get() {
- return (captions.getCurrentTrack.call(this) || {}).language;
- }
-
- /**
- * Toggle picture-in-picture playback on WebKit/MacOS
- * TODO: update player with state, support, enabled
- * TODO: detect outside changes
- */
-
- }, {
- key: 'pip',
- set: function set(input) {
- var states = {
- pip: 'picture-in-picture',
- inline: 'inline'
- };
-
- // Bail if no support
- if (!support.pip) {
- return;
- }
-
- // Toggle based on current state if not passed
- var toggle = is$1.boolean(input) ? input : this.pip === states.inline;
-
- // Toggle based on current state
- this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);
- }
-
- /**
- * Get the current picture-in-picture state
- */
- ,
- get: function get() {
- if (!support.pip) {
- return null;
- }
-
- return this.media.webkitPresentationMode;
- }
- }], [{
- key: 'supported',
- value: function supported(type, provider, inline) {
- return support.check(type, provider, inline);
- }
-
- /**
- * Load an SVG sprite into the page
- * @param {string} url - URL for the SVG sprite
- * @param {string} [id] - Unique ID
- */
-
- }, {
- key: 'loadSprite',
- value: function loadSprite$$1(url, id) {
- return loadSprite(url, id);
- }
-
- /**
- * Setup multiple instances
- * @param {*} selector
- * @param {object} options
- */
-
- }, {
- key: 'setup',
- value: function setup(selector) {
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
- var targets = null;
-
- if (is$1.string(selector)) {
- targets = Array.from(document.querySelectorAll(selector));
- } else if (is$1.nodeList(selector)) {
- targets = Array.from(selector);
- } else if (is$1.array(selector)) {
- targets = selector.filter(is$1.element);
- }
-
- if (is$1.empty(targets)) {
- return null;
- }
-
- return targets.map(function (t) {
- return new Plyr(t, options);
- });
- }
- }]);
- return Plyr;
- }();
-
- Plyr.defaults = cloneDeep(defaults$1);
-
- // ==========================================================================
-
- return Plyr;
+ this.fullscreen = new Fullscreen(this); // Setup ads if provided
+
+ if (this.config.ads.enabled) {
+ this.ads = new Ads(this);
+ } // Autoplay if required
+
+
+ if (this.config.autoplay) {
+ this.play();
+ }
+ } // ---------------------------------------
+ // API
+ // ---------------------------------------
+
+ /**
+ * Types and provider helpers
+ */
+
+
+ _createClass(Plyr, [{
+ key: "play",
+
+ /**
+ * Play the media, or play the advertisement (if they are not blocked)
+ */
+ value: function play() {
+ if (!is$1.function(this.media.play)) {
+ return null;
+ } // Return the promise (for HTML5)
+
+
+ return this.media.play();
+ }
+ /**
+ * Pause the media
+ */
+
+ }, {
+ key: "pause",
+ value: function pause() {
+ if (!this.playing || !is$1.function(this.media.pause)) {
+ return;
+ }
+
+ this.media.pause();
+ }
+ /**
+ * Get playing state
+ */
+
+ }, {
+ key: "togglePlay",
+
+ /**
+ * Toggle playback based on current status
+ * @param {boolean} input
+ */
+ value: function togglePlay(input) {
+ // Toggle based on current state if nothing passed
+ var toggle = is$1.boolean(input) ? input : !this.playing;
+
+ if (toggle) {
+ this.play();
+ } else {
+ this.pause();
+ }
+ }
+ /**
+ * Stop playback
+ */
+
+ }, {
+ key: "stop",
+ value: function stop() {
+ if (this.isHTML5) {
+ this.pause();
+ this.restart();
+ } else if (is$1.function(this.media.stop)) {
+ this.media.stop();
+ }
+ }
+ /**
+ * Restart playback
+ */
+
+ }, {
+ key: "restart",
+ value: function restart() {
+ this.currentTime = 0;
+ }
+ /**
+ * Rewind
+ * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
+ */
+
+ }, {
+ key: "rewind",
+ value: function rewind(seekTime) {
+ this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime);
+ }
+ /**
+ * Fast forward
+ * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
+ */
+
+ }, {
+ key: "forward",
+ value: function forward(seekTime) {
+ this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime);
+ }
+ /**
+ * Seek to a time
+ * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)
+ */
+
+ }, {
+ key: "increaseVolume",
+
+ /**
+ * Increase volume
+ * @param {boolean} step - How much to decrease by (between 0 and 1)
+ */
+ value: function increaseVolume(step) {
+ var volume = this.media.muted ? 0 : this.volume;
+ this.volume = volume + (is$1.number(step) ? step : 0);
+ }
+ /**
+ * Decrease volume
+ * @param {boolean} step - How much to decrease by (between 0 and 1)
+ */
+
+ }, {
+ key: "decreaseVolume",
+ value: function decreaseVolume(step) {
+ this.increaseVolume(-step);
+ }
+ /**
+ * Set muted state
+ * @param {boolean} mute
+ */
+
+ }, {
+ key: "toggleCaptions",
+
+ /**
+ * Toggle captions
+ * @param {boolean} input - Whether to enable captions
+ */
+ value: function toggleCaptions(input) {
+ captions.toggle.call(this, input, false);
+ }
+ /**
+ * Set the caption track by index
+ * @param {number} - Caption index
+ */
+
+ }, {
+ key: "airplay",
+
+ /**
+ * Trigger the airplay dialog
+ * TODO: update player with state, support, enabled
+ */
+ value: function airplay() {
+ // Show dialog if supported
+ if (support.airplay) {
+ this.media.webkitShowPlaybackTargetPicker();
+ }
+ }
+ /**
+ * Toggle the player controls
+ * @param {boolean} [toggle] - Whether to show the controls
+ */
+
+ }, {
+ key: "toggleControls",
+ value: function toggleControls(toggle) {
+ // Don't toggle if missing UI support or if it's audio
+ if (this.supported.ui && !this.isAudio) {
+ // Get state before change
+ var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls
+
+ var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state
+
+ var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu
+
+ if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {
+ controls.toggleMenu.call(this, false);
+ } // Trigger event on change
+
+
+ if (hiding !== isHidden) {
+ var eventName = hiding ? 'controlshidden' : 'controlsshown';
+ triggerEvent.call(this, this.media, eventName);
+ }
+
+ return !hiding;
+ }
+
+ return false;
+ }
+ /**
+ * Add event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: "on",
+ value: function on$$1(event, callback) {
+ on.call(this, this.elements.container, event, callback);
+ }
+ /**
+ * Add event listeners once
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: "once",
+ value: function once$$1(event, callback) {
+ once.call(this, this.elements.container, event, callback);
+ }
+ /**
+ * Remove event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: "off",
+ value: function off$$1(event, callback) {
+ off(this.elements.container, event, callback);
+ }
+ /**
+ * Destroy an instance
+ * Event listeners are removed when elements are removed
+ * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
+ * @param {function} callback - Callback for when destroy is complete
+ * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)
+ */
+
+ }, {
+ key: "destroy",
+ value: function destroy(callback) {
+ var _this2 = this;
+
+ var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (!this.ready) {
+ return;
+ }
+
+ var done = function done() {
+ // Reset overflow (incase destroyed while in fullscreen)
+ document.body.style.overflow = ''; // GC for embed
+
+ _this2.embed = null; // If it's a soft destroy, make minimal changes
+
+ if (soft) {
+ if (Object.keys(_this2.elements).length) {
+ // Remove elements
+ removeElement(_this2.elements.buttons.play);
+ removeElement(_this2.elements.captions);
+ removeElement(_this2.elements.controls);
+ removeElement(_this2.elements.wrapper); // Clear for GC
+
+ _this2.elements.buttons.play = null;
+ _this2.elements.captions = null;
+ _this2.elements.controls = null;
+ _this2.elements.wrapper = null;
+ } // Callback
+
+
+ if (is$1.function(callback)) {
+ callback();
+ }
+ } else {
+ // Unbind listeners
+ unbindListeners.call(_this2); // Replace the container with the original element provided
+
+ replaceElement(_this2.elements.original, _this2.elements.container); // Event
+
+ triggerEvent.call(_this2, _this2.elements.original, 'destroyed', true); // Callback
+
+ if (is$1.function(callback)) {
+ callback.call(_this2.elements.original);
+ } // Reset state
+
+
+ _this2.ready = false; // Clear for garbage collection
+
+ setTimeout(function () {
+ _this2.elements = null;
+ _this2.media = null;
+ }, 200);
+ }
+ }; // Stop playback
+
+
+ this.stop(); // Provider specific stuff
+
+ if (this.isHTML5) {
+ // Clear timeout
+ clearTimeout(this.timers.loading); // Restore native video controls
+
+ ui.toggleNativeControls.call(this, true); // Clean up
+
+ done();
+ } else if (this.isYouTube) {
+ // Clear timers
+ clearInterval(this.timers.buffering);
+ clearInterval(this.timers.playing); // Destroy YouTube API
+
+ if (this.embed !== null && is$1.function(this.embed.destroy)) {
+ this.embed.destroy();
+ } // Clean up
+
+
+ done();
+ } else if (this.isVimeo) {
+ // Destroy Vimeo API
+ // then clean up (wait, to prevent postmessage errors)
+ if (this.embed !== null) {
+ this.embed.unload().then(done);
+ } // Vimeo does not always return
+
+
+ setTimeout(done, 200);
+ }
+ }
+ /**
+ * Check for support for a mime type (HTML5 only)
+ * @param {string} type - Mime type
+ */
+
+ }, {
+ key: "supports",
+ value: function supports(type) {
+ return support.mime.call(this, type);
+ }
+ /**
+ * Check for support
+ * @param {string} type - Player type (audio/video)
+ * @param {string} provider - Provider (html5/youtube/vimeo)
+ * @param {bool} inline - Where player has `playsinline` sttribute
+ */
+
+ }, {
+ key: "isHTML5",
+ get: function get() {
+ return Boolean(this.provider === providers.html5);
+ }
+ }, {
+ key: "isEmbed",
+ get: function get() {
+ return Boolean(this.isYouTube || this.isVimeo);
+ }
+ }, {
+ key: "isYouTube",
+ get: function get() {
+ return Boolean(this.provider === providers.youtube);
+ }
+ }, {
+ key: "isVimeo",
+ get: function get() {
+ return Boolean(this.provider === providers.vimeo);
+ }
+ }, {
+ key: "isVideo",
+ get: function get() {
+ return Boolean(this.type === types.video);
+ }
+ }, {
+ key: "isAudio",
+ get: function get() {
+ return Boolean(this.type === types.audio);
+ }
+ }, {
+ key: "playing",
+ get: function get() {
+ return Boolean(this.ready && !this.paused && !this.ended);
+ }
+ /**
+ * Get paused state
+ */
+
+ }, {
+ key: "paused",
+ get: function get() {
+ return Boolean(this.media.paused);
+ }
+ /**
+ * Get stopped state
+ */
+
+ }, {
+ key: "stopped",
+ get: function get() {
+ return Boolean(this.paused && this.currentTime === 0);
+ }
+ /**
+ * Get ended state
+ */
+
+ }, {
+ key: "ended",
+ get: function get() {
+ return Boolean(this.media.ended);
+ }
+ }, {
+ key: "currentTime",
+ set: function set(input) {
+ // Bail if media duration isn't available yet
+ if (!this.duration) {
+ return;
+ } // Validate input
+
+
+ var inputIsValid = is$1.number(input) && input > 0; // Set
+
+ this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging
+
+ this.debug.log("Seeking to ".concat(this.currentTime, " seconds"));
+ }
+ /**
+ * Get current time
+ */
+ ,
+ get: function get() {
+ return Number(this.media.currentTime);
+ }
+ /**
+ * Get buffered
+ */
+
+ }, {
+ key: "buffered",
+ get: function get() {
+ var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1
+
+ if (is$1.number(buffered)) {
+ return buffered;
+ } // HTML5
+ // TODO: Handle buffered chunks of the media
+ // (i.e. seek to another section buffers only that section)
+
+
+ if (buffered && buffered.length && this.duration > 0) {
+ return buffered.end(0) / this.duration;
+ }
+
+ return 0;
+ }
+ /**
+ * Get seeking status
+ */
+
+ }, {
+ key: "seeking",
+ get: function get() {
+ return Boolean(this.media.seeking);
+ }
+ /**
+ * Get the duration of the current media
+ */
+
+ }, {
+ key: "duration",
+ get: function get() {
+ // Faux duration set via config
+ var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded
+
+ var realDuration = (this.media || {}).duration;
+ var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration
+
+ return fauxDuration || duration;
+ }
+ /**
+ * Set the player volume
+ * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
+ */
+
+ }, {
+ key: "volume",
+ set: function set(value) {
+ var volume = value;
+ var max = 1;
+ var min = 0;
+
+ if (is$1.string(volume)) {
+ volume = Number(volume);
+ } // Load volume from storage if no value specified
+
+
+ if (!is$1.number(volume)) {
+ volume = this.storage.get('volume');
+ } // Use config if all else fails
+
+
+ if (!is$1.number(volume)) {
+ volume = this.config.volume;
+ } // Maximum is volumeMax
+
+
+ if (volume > max) {
+ volume = max;
+ } // Minimum is volumeMin
+
+
+ if (volume < min) {
+ volume = min;
+ } // Update config
+
+
+ this.config.volume = volume; // Set the player volume
+
+ this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state
+
+ if (!is$1.empty(value) && this.muted && volume > 0) {
+ this.muted = false;
+ }
+ }
+ /**
+ * Get the current player volume
+ */
+ ,
+ get: function get() {
+ return Number(this.media.volume);
+ }
+ }, {
+ key: "muted",
+ set: function set(mute) {
+ var toggle = mute; // Load muted state from storage
+
+ if (!is$1.boolean(toggle)) {
+ toggle = this.storage.get('muted');
+ } // Use config if all else fails
+
+
+ if (!is$1.boolean(toggle)) {
+ toggle = this.config.muted;
+ } // Update config
+
+
+ this.config.muted = toggle; // Set mute on the player
+
+ this.media.muted = toggle;
+ }
+ /**
+ * Get current muted state
+ */
+ ,
+ get: function get() {
+ return Boolean(this.media.muted);
+ }
+ /**
+ * Check if the media has audio
+ */
+
+ }, {
+ key: "hasAudio",
+ get: function get() {
+ // Assume yes for all non HTML5 (as we can't tell...)
+ if (!this.isHTML5) {
+ return true;
+ }
+
+ if (this.isAudio) {
+ return true;
+ } // Get audio tracks
+
+
+ return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
+ }
+ /**
+ * Set playback speed
+ * @param {number} speed - the speed of playback (0.5-2.0)
+ */
+
+ }, {
+ key: "speed",
+ set: function set(input) {
+ var speed = null;
+
+ if (is$1.number(input)) {
+ speed = input;
+ }
+
+ if (!is$1.number(speed)) {
+ speed = this.storage.get('speed');
+ }
+
+ if (!is$1.number(speed)) {
+ speed = this.config.speed.selected;
+ } // Set min/max
+
+
+ if (speed < 0.1) {
+ speed = 0.1;
+ }
+
+ if (speed > 2.0) {
+ speed = 2.0;
+ }
+
+ if (!this.config.speed.options.includes(speed)) {
+ this.debug.warn("Unsupported speed (".concat(speed, ")"));
+ return;
+ } // Update config
+
+
+ this.config.speed.selected = speed; // Set media speed
+
+ this.media.playbackRate = speed;
+ }
+ /**
+ * Get current playback speed
+ */
+ ,
+ get: function get() {
+ return Number(this.media.playbackRate);
+ }
+ /**
+ * Set playback quality
+ * Currently HTML5 & YouTube only
+ * @param {number} input - Quality level
+ */
+
+ }, {
+ key: "quality",
+ set: function set(input) {
+ var config = this.config.quality;
+ var options = this.options.quality;
+
+ if (!options.length) {
+ return;
+ }
+
+ var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);
+
+ if (!options.includes(quality)) {
+ var value = closest(options, quality);
+ this.debug.warn("Unsupported quality option: ".concat(quality, ", using ").concat(value, " instead"));
+ quality = value;
+ } // Update config
+
+
+ config.selected = quality; // Set quality
+
+ this.media.quality = quality;
+ }
+ /**
+ * Get current quality level
+ */
+ ,
+ get: function get() {
+ return this.media.quality;
+ }
+ /**
+ * Toggle loop
+ * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
+ * @param {boolean} input - Whether to loop or not
+ */
+
+ }, {
+ key: "loop",
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : this.config.loop.active;
+ this.config.loop.active = toggle;
+ this.media.loop = toggle; // Set default to be a true toggle
+
+ /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
+ switch (type) {
+ case 'start':
+ if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
+ this.config.loop.end = null;
+ }
+ this.config.loop.start = this.currentTime;
+ // this.config.loop.indicator.start = this.elements.display.played.value;
+ break;
+ case 'end':
+ if (this.config.loop.start >= this.currentTime) {
+ return this;
+ }
+ this.config.loop.end = this.currentTime;
+ // this.config.loop.indicator.end = this.elements.display.played.value;
+ break;
+ case 'all':
+ this.config.loop.start = 0;
+ this.config.loop.end = this.duration - 2;
+ this.config.loop.indicator.start = 0;
+ this.config.loop.indicator.end = 100;
+ break;
+ case 'toggle':
+ if (this.config.loop.active) {
+ this.config.loop.start = 0;
+ this.config.loop.end = null;
+ } else {
+ this.config.loop.start = 0;
+ this.config.loop.end = this.duration - 2;
+ }
+ break;
+ default:
+ this.config.loop.start = 0;
+ this.config.loop.end = null;
+ break;
+ } */
+ }
+ /**
+ * Get current loop state
+ */
+ ,
+ get: function get() {
+ return Boolean(this.media.loop);
+ }
+ /**
+ * Set new media source
+ * @param {object} input - The new source object (see docs)
+ */
+
+ }, {
+ key: "source",
+ set: function set(input) {
+ source.change.call(this, input);
+ }
+ /**
+ * Get current source
+ */
+ ,
+ get: function get() {
+ return this.media.currentSrc;
+ }
+ /**
+ * Set the poster image for a video
+ * @param {input} - the URL for the new poster image
+ */
+
+ }, {
+ key: "poster",
+ set: function set(input) {
+ if (!this.isVideo) {
+ this.debug.warn('Poster can only be set for video');
+ return;
+ }
+
+ ui.setPoster.call(this, input, false).catch(function () {});
+ }
+ /**
+ * Get the current poster image
+ */
+ ,
+ get: function get() {
+ if (!this.isVideo) {
+ return null;
+ }
+
+ return this.media.getAttribute('poster');
+ }
+ /**
+ * Set the autoplay state
+ * @param {boolean} input - Whether to autoplay or not
+ */
+
+ }, {
+ key: "autoplay",
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : this.config.autoplay;
+ this.config.autoplay = toggle;
+ }
+ /**
+ * Get the current autoplay state
+ */
+ ,
+ get: function get() {
+ return Boolean(this.config.autoplay);
+ }
+ }, {
+ key: "currentTrack",
+ set: function set(input) {
+ captions.set.call(this, input, false);
+ }
+ /**
+ * Get the current caption track index (-1 if disabled)
+ */
+ ,
+ get: function get() {
+ var _this$captions = this.captions,
+ toggled = _this$captions.toggled,
+ currentTrack = _this$captions.currentTrack;
+ return toggled ? currentTrack : -1;
+ }
+ /**
+ * Set the wanted language for captions
+ * Since tracks can be added later it won't update the actual caption track until there is a matching track
+ * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
+ */
+
+ }, {
+ key: "language",
+ set: function set(input) {
+ captions.setLanguage.call(this, input, false);
+ }
+ /**
+ * Get the current track's language
+ */
+ ,
+ get: function get() {
+ return (captions.getCurrentTrack.call(this) || {}).language;
+ }
+ /**
+ * Toggle picture-in-picture playback on WebKit/MacOS
+ * TODO: update player with state, support, enabled
+ * TODO: detect outside changes
+ */
+
+ }, {
+ key: "pip",
+ set: function set(input) {
+ var states = {
+ pip: 'picture-in-picture',
+ inline: 'inline'
+ }; // Bail if no support
+
+ if (!support.pip) {
+ return;
+ } // Toggle based on current state if not passed
+
+
+ var toggle = is$1.boolean(input) ? input : this.pip === states.inline; // Toggle based on current state
+
+ this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);
+ }
+ /**
+ * Get the current picture-in-picture state
+ */
+ ,
+ get: function get() {
+ if (!support.pip) {
+ return null;
+ }
+
+ return this.media.webkitPresentationMode;
+ }
+ }], [{
+ key: "supported",
+ value: function supported(type, provider, inline) {
+ return support.check(type, provider, inline);
+ }
+ /**
+ * Load an SVG sprite into the page
+ * @param {string} url - URL for the SVG sprite
+ * @param {string} [id] - Unique ID
+ */
+
+ }, {
+ key: "loadSprite",
+ value: function loadSprite$$1(url, id) {
+ return loadSprite(url, id);
+ }
+ /**
+ * Setup multiple instances
+ * @param {*} selector
+ * @param {object} options
+ */
+
+ }, {
+ key: "setup",
+ value: function setup(selector) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var targets = null;
+
+ if (is$1.string(selector)) {
+ targets = Array.from(document.querySelectorAll(selector));
+ } else if (is$1.nodeList(selector)) {
+ targets = Array.from(selector);
+ } else if (is$1.array(selector)) {
+ targets = selector.filter(is$1.element);
+ }
+
+ if (is$1.empty(targets)) {
+ return null;
+ }
+
+ return targets.map(function (t) {
+ return new Plyr(t, options);
+ });
+ }
+ }]);
+
+ return Plyr;
+ }();
+
+ Plyr.defaults = cloneDeep(defaults);
+
+ // ==========================================================================
+
+ return Plyr;
})));
diff --git a/dist/plyr.polyfilled.js.map b/dist/plyr.polyfilled.js.map
index 39845b2a..b44b2832 100644
--- a/dist/plyr.polyfilled.js.map
+++ b/dist/plyr.polyfilled.js.map
@@ -1 +1 @@
-{"version":3,"sources":["node_modules/core-js/modules/_global.js","node_modules/core-js/modules/_core.js","node_modules/core-js/modules/_is-object.js","node_modules/core-js/modules/_an-object.js","node_modules/core-js/modules/_fails.js","node_modules/core-js/modules/_descriptors.js","node_modules/core-js/modules/_dom-create.js","node_modules/core-js/modules/_ie8-dom-define.js","node_modules/core-js/modules/_to-primitive.js","node_modules/core-js/modules/_object-dp.js","node_modules/core-js/modules/_property-desc.js","node_modules/core-js/modules/_hide.js","node_modules/core-js/modules/_has.js","node_modules/core-js/modules/_uid.js","node_modules/core-js/modules/_redefine.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","node_modules/core-js/modules/_export.js","node_modules/core-js/modules/_typed.js","node_modules/core-js/modules/_library.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_to-index.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_iobject.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_shared-key.js","node_modules/core-js/modules/_object-keys-internal.js","node_modules/core-js/modules/_enum-bug-keys.js","node_modules/core-js/modules/_object-gopn.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_array-fill.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_typed-buffer.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/es6.typed.array-buffer.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_object-keys.js","node_modules/core-js/modules/_object-dps.js","node_modules/core-js/modules/_html.js","node_modules/core-js/modules/_object-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_is-array.js","node_modules/core-js/modules/_array-species-constructor.js","node_modules/core-js/modules/_array-species-create.js","node_modules/core-js/modules/_array-methods.js","node_modules/core-js/modules/_add-to-unscopables.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/_array-copy-within.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_typed-array.js","node_modules/core-js/modules/es6.typed.int8-array.js","node_modules/core-js/modules/es6.typed.uint8-array.js","node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","node_modules/core-js/modules/es6.typed.int16-array.js","node_modules/core-js/modules/es6.typed.uint16-array.js","node_modules/core-js/modules/es6.typed.int32-array.js","node_modules/core-js/modules/es6.typed.uint32-array.js","node_modules/core-js/modules/es6.typed.float32-array.js","node_modules/core-js/modules/es6.typed.float64-array.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-strong.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.map.js","node_modules/core-js/modules/es6.set.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/es6.weak-set.js","node_modules/core-js/modules/es6.reflect.apply.js","node_modules/core-js/modules/_invoke.js","node_modules/core-js/modules/_bind.js","node_modules/core-js/modules/es6.reflect.construct.js","node_modules/core-js/modules/es6.reflect.define-property.js","node_modules/core-js/modules/es6.reflect.delete-property.js","node_modules/core-js/modules/es6.reflect.get.js","node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","node_modules/core-js/modules/es6.reflect.get-prototype-of.js","node_modules/core-js/modules/es6.reflect.has.js","node_modules/core-js/modules/es6.reflect.is-extensible.js","node_modules/core-js/modules/_own-keys.js","node_modules/core-js/modules/es6.reflect.own-keys.js","node_modules/core-js/modules/es6.reflect.prevent-extensions.js","node_modules/core-js/modules/es6.reflect.set.js","node_modules/core-js/modules/es6.reflect.set-prototype-of.js","node_modules/core-js/modules/_task.js","node_modules/core-js/modules/_microtask.js","node_modules/core-js/modules/_new-promise-capability.js","node_modules/core-js/modules/_perform.js","node_modules/core-js/modules/_user-agent.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/_wks-ext.js","node_modules/core-js/modules/_wks-define.js","node_modules/core-js/modules/_enum-keys.js","node_modules/core-js/modules/_object-gopn-ext.js","node_modules/core-js/modules/es6.symbol.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.freeze.js","node_modules/core-js/modules/es6.object.seal.js","node_modules/core-js/modules/es6.object.prevent-extensions.js","node_modules/core-js/modules/es6.object.is-frozen.js","node_modules/core-js/modules/es6.object.is-sealed.js","node_modules/core-js/modules/es6.object.is-extensible.js","node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","node_modules/core-js/modules/es6.object.get-prototype-of.js","node_modules/core-js/modules/es6.object.keys.js","node_modules/core-js/modules/es6.object.get-own-property-names.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/_same-value.js","node_modules/core-js/modules/es6.object.is.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.string.raw.js","node_modules/core-js/modules/es6.string.from-code-point.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.code-point-at.js","node_modules/core-js/modules/_string-repeat.js","node_modules/core-js/modules/es6.string.repeat.js","node_modules/core-js/modules/_is-regexp.js","node_modules/core-js/modules/_string-context.js","node_modules/core-js/modules/_fails-is-regexp.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.string.ends-with.js","node_modules/core-js/modules/es6.string.includes.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/es6.array.of.js","node_modules/core-js/modules/es6.array.copy-within.js","node_modules/core-js/modules/es6.array.find.js","node_modules/core-js/modules/es6.array.find-index.js","node_modules/core-js/modules/es6.array.fill.js","node_modules/core-js/modules/es6.number.is-finite.js","node_modules/core-js/modules/_is-integer.js","node_modules/core-js/modules/es6.number.is-integer.js","node_modules/core-js/modules/es6.number.is-safe-integer.js","node_modules/core-js/modules/es6.number.is-nan.js","node_modules/core-js/modules/es6.number.epsilon.js","node_modules/core-js/modules/es6.number.min-safe-integer.js","node_modules/core-js/modules/es6.number.max-safe-integer.js","node_modules/core-js/modules/_math-log1p.js","node_modules/core-js/modules/es6.math.acosh.js","node_modules/core-js/modules/es6.math.asinh.js","node_modules/core-js/modules/es6.math.atanh.js","node_modules/core-js/modules/_math-sign.js","node_modules/core-js/modules/es6.math.cbrt.js","node_modules/core-js/modules/es6.math.clz32.js","node_modules/core-js/modules/es6.math.cosh.js","node_modules/core-js/modules/_math-expm1.js","node_modules/core-js/modules/es6.math.expm1.js","node_modules/core-js/modules/_math-fround.js","node_modules/core-js/modules/es6.math.fround.js","node_modules/core-js/modules/es6.math.hypot.js","node_modules/core-js/modules/es6.math.imul.js","node_modules/core-js/modules/es6.math.log1p.js","node_modules/core-js/modules/es6.math.log10.js","node_modules/core-js/modules/es6.math.log2.js","node_modules/core-js/modules/es6.math.sign.js","node_modules/core-js/modules/es6.math.sinh.js","node_modules/core-js/modules/es6.math.tanh.js","node_modules/core-js/modules/es6.math.trunc.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","node_modules/core-js/modules/_string-pad.js","node_modules/core-js/modules/es7.string.pad-start.js","node_modules/core-js/modules/es7.string.pad-end.js","node_modules/core-js/modules/web.timers.js","node_modules/core-js/modules/web.immediate.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/regenerator-runtime/runtime.js","node_modules/custom-event-polyfill/polyfill.js","node_modules/url-polyfill/url-polyfill.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js","src/js/plyr.polyfilled.js"],"names":["isObject","require$$0","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","has","hide","global","aFunction","core","ctx","redefine","uid","toInteger","toLength","cof","IObject","defined","min","toIObject","toAbsoluteIndex","$keys","toObject","DESCRIPTORS","toIndex","$typed","anInstance","arrayFill","redefineAll","fails","setToStringTag","SPECIES","buffer","VIEW","$export","speciesConstructor","TAG","Iterators","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","ITERATOR","classof","isArray","asc","ArrayProto","create","descriptor","$iterCreate","getPrototypeOf","step","addToUnscopables","pIE","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","require$$37","require$$38","getIterFn","isArrayIter","call","forOf","validate","$iterDefine","setSpecies","meta","$iterDetect","inheritIfRequired","strong","gOPS","createArrayMethod","id","$has","weak","assign","invoke","bind","gOPD","getProto","Reflect","gOPN","setProto","cel","html","process","Promise","navigator","newPromiseCapability","TypeError","isNode","newPromiseCapabilityModule","userAgent","perform","promiseResolve","LIBRARY","wksExt","toString","$GOPD","$DP","gOPNExt","wks","shared","ObjectProto","USE_NATIVE","$fails","_create","enumKeys","wksDefine","$getOwnPropertyDescriptor","$getPrototypeOf","isRegExp","MATCH","context","$defineProperty","createProperty","$find","KEY","forced","floor","isInteger","log1p","sign","$expm1","abs","exp","expm1","isEnum","ownKeys","repeat","$pad","wrap","$task","i","NAME","$iterators","this","getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","Object","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","Array","isWeakMap","WeakMap","isNodeList","NodeList","isElement","Element","isTextNode","Text","isEvent","Event","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isEmpty","length","keys","isUrl","URL","string","startsWith","hostname","e","nullOrUndefined","object","number","boolean","function","array","weakMap","nodeList","element","textNode","event","keyboardEvent","cue","track","url","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","is","events","split","forEach","eventListeners","push","type","on","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","plyr","dispatchEvent","unbindListeners","item","ready","setTimeout","resolve","elements","container","then","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","key","setAttribute","createElement","text","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","start","charAt","class","toggleHidden","hidden","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","trapFocus","focusable","first","last","trap","keyCode","focused","activeElement","shiftKey","focus","preventDefault","setFocus","tabFocus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","test","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","extend","player","set","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","Math","cloneDeep","JSON","parse","stringify","getDeep","path","obj","shift","generateId","prefix","random","format","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","Storage","enabled","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","universals","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","createRange","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","enumerable","children","node","listeners","currentTrack","speed","parseFloat","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","size","restore","propertyName","inner","home","backButton","inject","props","seektime","insertMethod","addProperty","controlPressed","labels","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","createObjectURL","blob","browserLanguages","languages","userLanguage","active","trackEvents","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","urls","vimeo","sdk","iframe","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","Fullscreen","property","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","removeCurrent","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","proxy","inputEvent","rect","currentTarget","attribute","hasAttribute","done","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","define","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","change","tagName","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.polyfilled.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","module.exports = false;\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var fin = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < fin) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n if (existingDescriptor = gOPD.f(receiver, propertyKey)) {\n if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n } else dP.f(receiver, propertyKey, createDesc(0, V));\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\n origPrevent = evt.preventDefault;\n evt.preventDefault = function() {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join(\"&\");\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if(base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if(baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) { \r\n throw new Error(\"URL unable to set base \" + base + \" due to \" + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(\n event => element.style[event] !== undefined,\n );\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, hasClass, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click touchstart', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // First touch on touch devices will just show controls (if we're hiding controls)\n // If controls are shown then it'll toggle like a pointer device\n if (\n player.config.hideControls &&\n player.touch &&\n hasClass(elements.container, player.config.classNames.hideControls)\n ) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = seekTo / seek.max * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { format, stripHTML } from '../utils/strings';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { format, generateId } from '../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.4.3\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n","// ==========================================================================\n// Plyr Polyfilled Build\n// plyr.js v3.4.3\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport 'babel-polyfill';\nimport 'custom-event-polyfill';\nimport 'url-polyfill';\nimport Plyr from './plyr';\n\nexport default Plyr;\n"]} \ No newline at end of file
+{"version":3,"sources":["node_modules/custom-event-polyfill/polyfill.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","node_modules/core-js/modules/_global.js","node_modules/core-js/modules/_core.js","node_modules/core-js/modules/_is-object.js","node_modules/core-js/modules/_an-object.js","node_modules/core-js/modules/_fails.js","node_modules/core-js/modules/_descriptors.js","node_modules/core-js/modules/_dom-create.js","node_modules/core-js/modules/_ie8-dom-define.js","node_modules/core-js/modules/_to-primitive.js","node_modules/core-js/modules/_object-dp.js","node_modules/core-js/modules/_property-desc.js","node_modules/core-js/modules/_hide.js","node_modules/core-js/modules/_has.js","node_modules/core-js/modules/_uid.js","node_modules/core-js/modules/_redefine.js","node_modules/core-js/modules/_export.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_library.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/_iobject.js","node_modules/core-js/modules/_is-array.js","node_modules/core-js/modules/_array-species-constructor.js","node_modules/core-js/modules/_array-species-create.js","node_modules/core-js/modules/_array-methods.js","node_modules/core-js/modules/_add-to-unscopables.js","node_modules/core-js/modules/es6.array.find.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.js","node_modules/core-js/modules/_shared-key.js","node_modules/core-js/modules/_object-keys-internal.js","node_modules/core-js/modules/_enum-bug-keys.js","node_modules/core-js/modules/_object-gopn.js","node_modules/core-js/modules/_string-ws.js","node_modules/core-js/modules/_string-trim.js","node_modules/core-js/modules/_object-keys.js","node_modules/core-js/modules/_object-dps.js","node_modules/core-js/modules/_html.js","node_modules/core-js/modules/_object-create.js","node_modules/core-js/modules/es6.number.constructor.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.keys.js","node_modules/core-js/modules/_is-regexp.js","node_modules/core-js/modules/_string-context.js","node_modules/core-js/modules/_fails-is-regexp.js","node_modules/core-js/modules/es6.string.includes.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/es6.regexp.to-string.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.iterator.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_invoke.js","node_modules/core-js/modules/_task.js","node_modules/core-js/modules/_microtask.js","node_modules/core-js/modules/_new-promise-capability.js","node_modules/core-js/modules/_perform.js","node_modules/core-js/modules/_user-agent.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.number.is-nan.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","node_modules/core-js/modules/es6.regexp.constructor.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/modules/_math-sign.js","node_modules/core-js/modules/es6.math.sign.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js","src/js/plyr.polyfilled.js"],"names":["global","this","aFunction","isObject","require$$0","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","has","hide","core","ctx","redefine","defined","uid","Iterators","toInteger","$defineProperty","cof","ITERATOR","classof","$export","toObject","getIterFn","isArrayIter","createProperty","call","toLength","isArray","speciesConstructor","asc","IObject","ArrayProto","toIObject","pIE","min","toAbsoluteIndex","$keys","spaces","fails","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","gOPD","require$$3","require$$4","inheritIfRequired","require$$5","require$$6","isRegExp","MATCH","context","wks","DESCRIPTORS","$flags","TAG","create","descriptor","setToStringTag","$iterCreate","getPrototypeOf","step","addToUnscopables","proto","key","$iterators","gOPS","createArrayMethod","id","anInstance","forOf","redefineAll","validate","$has","meta","$iterDetect","weak","assign","SPECIES","invoke","cel","html","process","Promise","navigator","newPromiseCapability","TypeError","isNode","newPromiseCapabilityModule","userAgent","perform","promiseResolve","LIBRARY","require$$7","getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","Object","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","Array","isWeakMap","WeakMap","isNodeList","NodeList","isElement","Element","isTextNode","Text","isEvent","Event","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isEmpty","length","keys","isUrl","URL","string","startsWith","hostname","e","nullOrUndefined","object","number","boolean","function","array","weakMap","nodeList","element","textNode","event","keyboardEvent","cue","track","url","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","is","events","split","forEach","type","eventListeners","push","on","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","plyr","dispatchEvent","unbindListeners","item","ready","resolve","setTimeout","elements","container","then","wrap","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","setAttribute","createElement","text","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","stripped","parts","start","charAt","class","toggleHidden","hidden","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","trapFocus","focusable","first","last","trap","keyCode","focused","activeElement","shiftKey","focus","preventDefault","setFocus","tabFocus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","test","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","extend","player","set","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","Math","abs","cloneDeep","JSON","parse","stringify","getDeep","path","obj","shift","gOPN","Base","i","generateId","prefix","floor","random","format","toString","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","Storage","enabled","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","universals","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","createRange","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","size","restore","propertyName","inner","home","backButton","inject","props","seektime","insertMethod","addProperty","controlPressed","labels","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","browserLanguages","languages","userLanguage","active","trackEvents","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","urls","vimeo","sdk","iframe","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","removeCurrent","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","proxy","inputEvent","rect","currentTarget","attribute","hasAttribute","done","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","NAME","define","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","change","tagName","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.polyfilled.js","sourcesContent":["// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\n origPrevent = evt.preventDefault;\n evt.preventDefault = function() {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if (iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams = function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { writable: true, value: {} });\r\n\r\n if (typeof searchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\r\n }\r\n } else if (searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(name, value);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if (name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for (var name in this._entries) {\r\n if (this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for (var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n if (iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n this._entries = {};\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for (var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n });\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if (!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n if (typeof URLSearchParams.prototype.sort !== 'function') {\r\n URLSearchParams.prototype.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if (typeof url !== 'string') url = String(url);\r\n\r\n // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n\r\n\r\n // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href': {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/, '');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname': {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = { 'http:': 80, 'https:': 443, 'ftp:': 21 }[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== '';\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if (!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if ((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch (e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","module.exports = {};\n","module.exports = false;\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","exports.f = {}.propertyIsEnumerable;\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\n}\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { format, stripHTML } from '../utils/strings';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { format, generateId } from '../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.4.4\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n","// ==========================================================================\n// Plyr Polyfilled Build\n// plyr.js v3.4.4\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport 'custom-event-polyfill';\nimport 'url-polyfill';\nimport Plyr from './plyr';\n\nexport default Plyr;\n"]} \ No newline at end of file
diff --git a/dist/plyr.polyfilled.min.js b/dist/plyr.polyfilled.min.js
index b97cce7e..bf9e7d56 100644
--- a/dist/plyr.polyfilled.min.js
+++ b/dist/plyr.polyfilled.min.js
@@ -1,2 +1,2 @@
-"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}var n=t(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),i=t(function(e){var t=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=t)}),r=(i.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),o=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e},a=function(e){try{return!!e()}catch(e){return!0}},s=!a(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),l=n.document,c=r(l)&&r(l.createElement),u=function(e){return c?l.createElement(e):{}},f=!s&&!a(function(){return 7!=Object.defineProperty(u("div"),"a",{get:function(){return 7}}).a}),h=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},d=Object.defineProperty,p={f:s?Object.defineProperty:function(e,t,n){if(o(e),t=h(t,!0),o(n),f)try{return d(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},g=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},m=s?function(e,t,n){return p.f(e,t,g(1,n))}:function(e,t,n){return e[t]=n,e},v={}.hasOwnProperty,y=function(e,t){return v.call(e,t)},b=0,w=Math.random(),k=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++b+w).toString(36))},T=t(function(e){var t=k("src"),r=Function.toString,o=(""+r).split("toString");i.inspectSource=function(e){return r.call(e)},(e.exports=function(e,i,r,a){var s="function"==typeof r;s&&(y(r,"name")||m(r,"name",i)),e[i]!==r&&(s&&(y(r,t)||m(r,t,e[i]?""+e[i]:o.join(String(i)))),e===n?e[i]=r:a?e[i]?e[i]=r:m(e,i,r):(delete e[i],m(e,i,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||r.call(this)})}),E=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},S=function(e,t,n){if(E(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},_=function(e,t,r){var o,a,s,l,c=e&_.F,u=e&_.G,f=e&_.S,h=e&_.P,d=e&_.B,p=u?n:f?n[t]||(n[t]={}):(n[t]||{}).prototype,g=u?i:i[t]||(i[t]={}),v=g.prototype||(g.prototype={});for(o in u&&(r=t),r)s=((a=!c&&p&&void 0!==p[o])?p:r)[o],l=d&&a?S(s,n):h&&"function"==typeof s?S(Function.call,s):s,p&&T(p,o,s,e&_.U),g[o]!=s&&m(g,o,l),h&&v[o]!=s&&(v[o]=s)};n.core=i,_.F=1,_.G=2,_.S=4,_.P=8,_.B=16,_.W=32,_.U=64,_.R=128;for(var A,P=_,M=k("typed_array"),L=k("view"),x=!(!n.ArrayBuffer||!n.DataView),C=x,O=0,N="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");O<9;)(A=n[N[O++]])?(m(A.prototype,M,!0),m(A.prototype,L,!0)):C=!1;var j={ABV:x,CONSTR:C,TYPED:M,VIEW:L},I=function(e,t,n){for(var i in t)T(e,i,t[i],n);return e},F=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},R=Math.ceil,B=Math.floor,D=function(e){return isNaN(e=+e)?0:(e>0?B:R)(e)},V=Math.min,U=function(e){return e>0?V(D(e),9007199254740991):0},q=function(e){if(void 0===e)return 0;var t=D(e),n=U(t);if(t!==n)throw RangeError("Wrong length!");return n},H={}.toString,W=function(e){return H.call(e).slice(8,-1)},z=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==W(e)?e.split(""):Object(e)},K=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},G=function(e){return z(K(e))},Y=Math.max,J=Math.min,Q=function(e,t){return(e=D(e))<0?Y(e+t,0):J(e,t)},$=function(e){return function(t,n,i){var r,o=G(t),a=U(o.length),s=Q(i,a);if(e&&n!=n){for(;a>s;)if((r=o[s++])!=r)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},X=t(function(e){var t=n["__core-js_shared__"]||(n["__core-js_shared__"]={});(e.exports=function(e,n){return t[e]||(t[e]=void 0!==n?n:{})})("versions",[]).push({version:i.version,mode:"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})}),Z=X("keys"),ee=function(e){return Z[e]||(Z[e]=k(e))},te=$(!1),ne=ee("IE_PROTO"),ie=function(e,t){var n,i=G(e),r=0,o=[];for(n in i)n!=ne&&y(i,n)&&o.push(n);for(;t.length>r;)y(i,n=t[r++])&&(~te(o,n)||o.push(n));return o},re="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),oe=re.concat("length","prototype"),ae={f:Object.getOwnPropertyNames||function(e){return ie(e,oe)}},se=function(e){return Object(K(e))},le=function(e){for(var t=se(this),n=U(t.length),i=arguments.length,r=Q(i>1?arguments[1]:void 0,n),o=i>2?arguments[2]:void 0,a=void 0===o?n:Q(o,n);a>r;)t[r++]=e;return t},ce=t(function(e){var t=X("wks"),i=n.Symbol,r="function"==typeof i;(e.exports=function(e){return t[e]||(t[e]=r&&i[e]||(r?i:k)("Symbol."+e))}).store=t}),ue=p.f,fe=ce("toStringTag"),he=function(e,t,n){e&&!y(e=n?e:e.prototype,fe)&&ue(e,fe,{configurable:!0,value:t})},de=t(function(e,t){var i=ae.f,r=p.f,o="prototype",l="Wrong index!",c=n.ArrayBuffer,u=n.DataView,f=n.Math,h=n.RangeError,d=n.Infinity,g=c,v=f.abs,y=f.pow,b=f.floor,w=f.log,k=f.LN2,T=s?"_b":"buffer",E=s?"_l":"byteLength",S=s?"_o":"byteOffset";function _(e,t,n){var i,r,o,a=new Array(n),s=8*n-t-1,l=(1<<s)-1,c=l>>1,u=23===t?y(2,-24)-y(2,-77):0,f=0,h=e<0||0===e&&1/e<0?1:0;for((e=v(e))!=e||e===d?(r=e!=e?1:0,i=l):(i=b(w(e)/k),e*(o=y(2,-i))<1&&(i--,o*=2),(e+=i+c>=1?u/o:u*y(2,1-c))*o>=2&&(i++,o/=2),i+c>=l?(r=0,i=l):i+c>=1?(r=(e*o-1)*y(2,t),i+=c):(r=e*y(2,c-1)*y(2,t),i=0));t>=8;a[f++]=255&r,r/=256,t-=8);for(i=i<<t|r,s+=t;s>0;a[f++]=255&i,i/=256,s-=8);return a[--f]|=128*h,a}function A(e,t,n){var i,r=8*n-t-1,o=(1<<r)-1,a=o>>1,s=r-7,l=n-1,c=e[l--],u=127&c;for(c>>=7;s>0;u=256*u+e[l],l--,s-=8);for(i=u&(1<<-s)-1,u>>=-s,s+=t;s>0;i=256*i+e[l],l--,s-=8);if(0===u)u=1-a;else{if(u===o)return i?NaN:c?-d:d;i+=y(2,t),u-=a}return(c?-1:1)*i*y(2,u-t)}function P(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function M(e){return[255&e]}function L(e){return[255&e,e>>8&255]}function x(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function C(e){return _(e,52,8)}function O(e){return _(e,23,4)}function N(e,t,n){r(e[o],t,{get:function(){return this[n]}})}function R(e,t,n,i){var r=q(+n);if(r+t>e[E])throw h(l);var o=e[T]._b,a=r+e[S],s=o.slice(a,a+t);return i?s:s.reverse()}function B(e,t,n,i,r,o){var a=q(+n);if(a+t>e[E])throw h(l);for(var s=e[T]._b,c=a+e[S],u=i(+r),f=0;f<t;f++)s[c+f]=u[o?f:t-f-1]}if(j.ABV){if(!a(function(){c(1)})||!a(function(){new c(-1)})||a(function(){return new c,new c(1.5),new c(NaN),"ArrayBuffer"!=c.name})){for(var V,H=(c=function(e){return F(this,c),new g(q(e))})[o]=g[o],W=i(g),z=0;W.length>z;)(V=W[z++])in c||m(c,V,g[V]);H.constructor=c}var K=new u(new c(2)),G=u[o].setInt8;K.setInt8(0,2147483648),K.setInt8(1,2147483649),!K.getInt8(0)&&K.getInt8(1)||I(u[o],{setInt8:function(e,t){G.call(this,e,t<<24>>24)},setUint8:function(e,t){G.call(this,e,t<<24>>24)}},!0)}else c=function(e){F(this,c,"ArrayBuffer");var t=q(e);this._b=le.call(new Array(t),0),this[E]=t},u=function(e,t,n){F(this,u,"DataView"),F(e,c,"DataView");var i=e[E],r=D(t);if(r<0||r>i)throw h("Wrong offset!");if(r+(n=void 0===n?i-r:U(n))>i)throw h("Wrong length!");this[T]=e,this[S]=r,this[E]=n},s&&(N(c,"byteLength","_l"),N(u,"buffer","_b"),N(u,"byteLength","_l"),N(u,"byteOffset","_o")),I(u[o],{getInt8:function(e){return R(this,1,e)[0]<<24>>24},getUint8:function(e){return R(this,1,e)[0]},getInt16:function(e){var t=R(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=R(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return P(R(this,4,e,arguments[1]))},getUint32:function(e){return P(R(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return A(R(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return A(R(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){B(this,1,e,M,t)},setUint8:function(e,t){B(this,1,e,M,t)},setInt16:function(e,t){B(this,2,e,L,t,arguments[2])},setUint16:function(e,t){B(this,2,e,L,t,arguments[2])},setInt32:function(e,t){B(this,4,e,x,t,arguments[2])},setUint32:function(e,t){B(this,4,e,x,t,arguments[2])},setFloat32:function(e,t){B(this,4,e,O,t,arguments[2])},setFloat64:function(e,t){B(this,8,e,C,t,arguments[2])}});he(c,"ArrayBuffer"),he(u,"DataView"),m(u[o],j.VIEW,!0),t.ArrayBuffer=c,t.DataView=u}),pe=ce("species"),ge=function(e,t){var n,i=o(e).constructor;return void 0===i||null==(n=o(i)[pe])?t:E(n)},me=ce("species"),ve=function(e){var t=n[e];s&&t&&!t[me]&&p.f(t,me,{configurable:!0,get:function(){return this}})},ye=n.ArrayBuffer,be=de.ArrayBuffer,we=de.DataView,ke=j.ABV&&ye.isView,Te=be.prototype.slice,Ee=j.VIEW;P(P.G+P.W+P.F*(ye!==be),{ArrayBuffer:be}),P(P.S+P.F*!j.CONSTR,"ArrayBuffer",{isView:function(e){return ke&&ke(e)||r(e)&&Ee in e}}),P(P.P+P.U+P.F*a(function(){return!new be(2).slice(1,void 0).byteLength}),"ArrayBuffer",{slice:function(e,t){if(void 0!==Te&&void 0===t)return Te.call(o(this),e);for(var n=o(this).byteLength,i=Q(e,n),r=Q(void 0===t?n:t,n),a=new(ge(this,be))(U(r-i)),s=new we(this),l=new we(a),c=0;i<r;)l.setUint8(c++,s.getUint8(i++));return a}}),ve("ArrayBuffer");var Se=ce("toStringTag"),_e="Arguments"==W(function(){return arguments}()),Ae=function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),Se))?n:_e?W(t):"Object"==(i=W(t))&&"function"==typeof t.callee?"Arguments":i},Pe={},Me=ce("iterator"),Le=Array.prototype,xe=function(e){return void 0!==e&&(Pe.Array===e||Le[Me]===e)},Ce=Object.keys||function(e){return ie(e,re)},Oe=s?Object.defineProperties:function(e,t){o(e);for(var n,i=Ce(t),r=i.length,a=0;r>a;)p.f(e,n=i[a++],t[n]);return e},Ne=n.document,je=Ne&&Ne.documentElement,Ie=ee("IE_PROTO"),Fe=function(){},Re=function(){var e,t=u("iframe"),n=re.length;for(t.style.display="none",je.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),Re=e.F;n--;)delete Re.prototype[re[n]];return Re()},Be=Object.create||function(e,t){var n;return null!==e?(Fe.prototype=o(e),n=new Fe,Fe.prototype=null,n[Ie]=e):n=Re(),void 0===t?n:Oe(n,t)},De=ee("IE_PROTO"),Ve=Object.prototype,Ue=Object.getPrototypeOf||function(e){return e=se(e),y(e,De)?e[De]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Ve:null},qe=ce("iterator"),He=i.getIteratorMethod=function(e){if(null!=e)return e[qe]||e["@@iterator"]||Pe[Ae(e)]},We=Array.isArray||function(e){return"Array"==W(e)},ze=ce("species"),Ke=function(e,t){return new(function(e){var t;return We(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!We(t.prototype)||(t=void 0),r(t)&&null===(t=t[ze])&&(t=void 0)),void 0===t?Array:t}(e))(t)},Ge=function(e,t){var n=1==e,i=2==e,r=3==e,o=4==e,a=6==e,s=5==e||a,l=t||Ke;return function(t,c,u){for(var f,h,d=se(t),p=z(d),g=S(c,u,3),m=U(p.length),v=0,y=n?l(t,m):i?l(t,0):void 0;m>v;v++)if((s||v in p)&&(h=g(f=p[v],v,d),e))if(n)y[v]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return v;case 2:y.push(f)}else if(o)return!1;return a?-1:r||o?o:y}},Ye=ce("unscopables"),Je=Array.prototype;null==Je[Ye]&&m(Je,Ye,{});var Qe=function(e){Je[Ye][e]=!0},$e=function(e,t){return{value:t,done:!!e}},Xe={};m(Xe,ce("iterator"),function(){return this});var Ze=function(e,t,n){e.prototype=Be(Xe,{next:g(1,n)}),he(e,t+" Iterator")},et=ce("iterator"),tt=!([].keys&&"next"in[].keys()),nt=function(){return this},it=function(e,t,n,i,r,o,a){Ze(n,t,i);var s,l,c,u=function(e){if(!tt&&e in p)return p[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},f=t+" Iterator",h="values"==r,d=!1,p=e.prototype,g=p[et]||p["@@iterator"]||r&&p[r],v=g||u(r),y=r?h?u("entries"):v:void 0,b="Array"==t&&p.entries||g;if(b&&(c=Ue(b.call(new e)))!==Object.prototype&&c.next&&(he(c,f,!0),"function"!=typeof c[et]&&m(c,et,nt)),h&&g&&"values"!==g.name&&(d=!0,v=function(){return g.call(this)}),(tt||d||!p[et])&&m(p,et,v),Pe[t]=v,Pe[f]=nt,r)if(s={values:h?v:u("values"),keys:o?v:u("keys"),entries:y},a)for(l in s)l in p||T(p,l,s[l]);else P(P.P+P.F*(tt||d),t,s);return s},rt=it(Array,"Array",function(e,t){this._t=G(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,$e(1)):$e(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");Pe.Arguments=Pe.Array,Qe("keys"),Qe("values"),Qe("entries");var ot=ce("iterator"),at=!1;try{[7][ot]().return=function(){at=!0}}catch(e){}var st=function(e,t){if(!t&&!at)return!1;var n=!1;try{var i=[7],r=i[ot]();r.next=function(){return{done:n=!0}},i[ot]=function(){return r},e(i)}catch(e){}return n},lt=[].copyWithin||function(e,t){var n=se(this),i=U(n.length),r=Q(e,i),o=Q(t,i),a=arguments.length>2?arguments[2]:void 0,s=Math.min((void 0===a?i:Q(a,i))-o,i-r),l=1;for(o<r&&r<o+s&&(l=-1,o+=s-1,r+=s-1);s-- >0;)o in n?n[r]=n[o]:delete n[r],r+=l,o+=l;return n},ct={f:{}.propertyIsEnumerable},ut=Object.getOwnPropertyDescriptor,ft={f:s?ut:function(e,t){if(e=G(e),t=h(t,!0),f)try{return ut(e,t)}catch(e){}if(y(e,t))return g(!ct.f.call(e,t),e[t])}},ht=t(function(e){if(s){var t=n,i=a,o=P,l=j,c=de,u=S,f=F,d=g,v=m,b=I,w=D,T=U,E=q,_=Q,A=h,M=y,L=Ae,x=r,C=se,O=xe,N=Be,R=Ue,B=ae.f,V=He,H=k,W=ce,z=Ge,K=$,G=ge,Y=rt,J=Pe,X=st,Z=ve,ee=le,te=lt,ne=p,ie=ft,re=ne.f,oe=ie.f,ue=t.RangeError,fe=t.TypeError,he=t.Uint8Array,pe=Array.prototype,me=c.ArrayBuffer,ye=c.DataView,be=z(0),we=z(2),ke=z(3),Te=z(4),Ee=z(5),Se=z(6),_e=K(!0),Me=K(!1),Le=Y.values,Ce=Y.keys,Oe=Y.entries,Ne=pe.lastIndexOf,je=pe.reduce,Ie=pe.reduceRight,Fe=pe.join,Re=pe.sort,De=pe.slice,Ve=pe.toString,qe=pe.toLocaleString,We=W("iterator"),ze=W("toStringTag"),Ke=H("typed_constructor"),Ye=H("def_constructor"),Je=l.CONSTR,Qe=l.TYPED,$e=l.VIEW,Xe=z(1,function(e,t){return it(G(e,e[Ye]),t)}),Ze=i(function(){return 1===new he(new Uint16Array([1]).buffer)[0]}),et=!!he&&!!he.prototype.set&&i(function(){new he(1).set({})}),tt=function(e,t){var n=w(e);if(n<0||n%t)throw ue("Wrong offset!");return n},nt=function(e){if(x(e)&&Qe in e)return e;throw fe(e+" is not a typed array!")},it=function(e,t){if(!(x(e)&&Ke in e))throw fe("It is not a typed array constructor!");return new e(t)},ot=function(e,t){return at(G(e,e[Ye]),t)},at=function(e,t){for(var n=0,i=t.length,r=it(e,i);i>n;)r[n]=t[n++];return r},ct=function(e,t,n){re(e,t,{get:function(){return this._d[n]}})},ut=function(e){var t,n,i,r,o,a,s=C(e),l=arguments.length,c=l>1?arguments[1]:void 0,f=void 0!==c,h=V(s);if(null!=h&&!O(h)){for(a=h.call(s),i=[],t=0;!(o=a.next()).done;t++)i.push(o.value);s=i}for(f&&l>2&&(c=u(c,arguments[2],2)),t=0,n=T(s.length),r=it(this,n);n>t;t++)r[t]=f?c(s[t],t):s[t];return r},ht=function(){for(var e=0,t=arguments.length,n=it(this,t);t>e;)n[e]=arguments[e++];return n},dt=!!he&&i(function(){qe.call(new he(1))}),pt=function(){return qe.apply(dt?De.call(nt(this)):nt(this),arguments)},gt={copyWithin:function(e,t){return te.call(nt(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Te(nt(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return ee.apply(nt(this),arguments)},filter:function(e){return ot(this,we(nt(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return Ee(nt(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return Se(nt(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){be(nt(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return Me(nt(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return _e(nt(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return Fe.apply(nt(this),arguments)},lastIndexOf:function(e){return Ne.apply(nt(this),arguments)},map:function(e){return Xe(nt(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return je.apply(nt(this),arguments)},reduceRight:function(e){return Ie.apply(nt(this),arguments)},reverse:function(){for(var e,t=nt(this).length,n=Math.floor(t/2),i=0;i<n;)e=this[i],this[i++]=this[--t],this[t]=e;return this},some:function(e){return ke(nt(this),e,arguments.length>1?arguments[1]:void 0)},sort:function(e){return Re.call(nt(this),e)},subarray:function(e,t){var n=nt(this),i=n.length,r=_(e,i);return new(G(n,n[Ye]))(n.buffer,n.byteOffset+r*n.BYTES_PER_ELEMENT,T((void 0===t?i:_(t,i))-r))}},mt=function(e,t){return ot(this,De.call(nt(this),e,t))},vt=function(e){nt(this);var t=tt(arguments[1],1),n=this.length,i=C(e),r=T(i.length),o=0;if(r+t>n)throw ue("Wrong length!");for(;o<r;)this[t+o]=i[o++]},yt={entries:function(){return Oe.call(nt(this))},keys:function(){return Ce.call(nt(this))},values:function(){return Le.call(nt(this))}},bt=function(e,t){return x(e)&&e[Qe]&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},wt=function(e,t){return bt(e,t=A(t,!0))?d(2,e[t]):oe(e,t)},kt=function(e,t,n){return!(bt(e,t=A(t,!0))&&x(n)&&M(n,"value"))||M(n,"get")||M(n,"set")||n.configurable||M(n,"writable")&&!n.writable||M(n,"enumerable")&&!n.enumerable?re(e,t,n):(e[t]=n.value,e)};Je||(ie.f=wt,ne.f=kt),o(o.S+o.F*!Je,"Object",{getOwnPropertyDescriptor:wt,defineProperty:kt}),i(function(){Ve.call({})})&&(Ve=qe=function(){return Fe.call(this)});var Tt=b({},gt);b(Tt,yt),v(Tt,We,yt.values),b(Tt,{slice:mt,set:vt,constructor:function(){},toString:Ve,toLocaleString:pt}),ct(Tt,"buffer","b"),ct(Tt,"byteOffset","o"),ct(Tt,"byteLength","l"),ct(Tt,"length","e"),re(Tt,ze,{get:function(){return this[Qe]}}),e.exports=function(e,n,r,a){var s=e+((a=!!a)?"Clamped":"")+"Array",c="get"+e,u="set"+e,h=t[s],d=h||{},p=h&&R(h),g=!h||!l.ABV,m={},y=h&&h.prototype,b=function(e,t){re(e,t,{get:function(){return function(e,t){var i=e._d;return i.v[c](t*n+i.o,Ze)}(this,t)},set:function(e){return function(e,t,i){var r=e._d;a&&(i=(i=Math.round(i))<0?0:i>255?255:255&i),r.v[u](t*n+r.o,i,Ze)}(this,t,e)},enumerable:!0})};g?(h=r(function(e,t,i,r){f(e,h,s,"_d");var o,a,l,c,u=0,d=0;if(x(t)){if(!(t instanceof me||"ArrayBuffer"==(c=L(t))||"SharedArrayBuffer"==c))return Qe in t?at(h,t):ut.call(h,t);o=t,d=tt(i,n);var p=t.byteLength;if(void 0===r){if(p%n)throw ue("Wrong length!");if((a=p-d)<0)throw ue("Wrong length!")}else if((a=T(r)*n)+d>p)throw ue("Wrong length!");l=a/n}else l=E(t),o=new me(a=l*n);for(v(e,"_d",{b:o,o:d,l:a,e:l,v:new ye(o)});u<l;)b(e,u++)}),y=h.prototype=N(Tt),v(y,"constructor",h)):i(function(){h(1)})&&i(function(){new h(-1)})&&X(function(e){new h,new h(null),new h(1.5),new h(e)},!0)||(h=r(function(e,t,i,r){var o;return f(e,h,s),x(t)?t instanceof me||"ArrayBuffer"==(o=L(t))||"SharedArrayBuffer"==o?void 0!==r?new d(t,tt(i,n),r):void 0!==i?new d(t,tt(i,n)):new d(t):Qe in t?at(h,t):ut.call(h,t):new d(E(t))}),be(p!==Function.prototype?B(d).concat(B(p)):B(d),function(e){e in h||v(h,e,d[e])}),h.prototype=y,y.constructor=h);var w=y[We],k=!!w&&("values"==w.name||null==w.name),S=yt.values;v(h,Ke,!0),v(y,Qe,s),v(y,$e,!0),v(y,Ye,h),(a?new h(1)[ze]==s:ze in y)||re(y,ze,{get:function(){return s}}),m[s]=h,o(o.G+o.W+o.F*(h!=d),m),o(o.S,s,{BYTES_PER_ELEMENT:n}),o(o.S+o.F*i(function(){d.of.call(h,1)}),s,{from:ut,of:ht}),"BYTES_PER_ELEMENT"in y||v(y,"BYTES_PER_ELEMENT",n),o(o.P,s,gt),Z(s),o(o.P+o.F*et,s,{set:vt}),o(o.P+o.F*!k,s,yt),y.toString!=Ve&&(y.toString=Ve),o(o.P+o.F*i(function(){new h(1).slice()}),s,{slice:mt}),o(o.P+o.F*(i(function(){return[1,2].toLocaleString()!=new h([1,2]).toLocaleString()})||!i(function(){y.toLocaleString.call([1,2])})),s,{toLocaleString:pt}),J[s]=k?w:S,k||v(y,We,S)}}else e.exports=function(){}});ht("Int8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}},!0),ht("Int16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Uint16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Int32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Uint32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Float32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Float64",8,function(e){return function(t,n,i){return e(this,t,n,i)}});var dt=function(e,t,n,i){try{return i?t(o(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&o(r.call(e)),t}},pt=t(function(e){var t={},n={},i=e.exports=function(e,i,r,a,s){var l,c,u,f,h=s?function(){return e}:He(e),d=S(r,a,i?2:1),p=0;if("function"!=typeof h)throw TypeError(e+" is not iterable!");if(xe(h)){for(l=U(e.length);l>p;p++)if((f=i?d(o(c=e[p])[0],c[1]):d(e[p]))===t||f===n)return f}else for(u=h.call(e);!(c=u.next()).done;)if((f=dt(u,d,c.value,i))===t||f===n)return f};i.BREAK=t,i.RETURN=n}),gt=t(function(e){var t=k("meta"),n=p.f,i=0,o=Object.isExtensible||function(){return!0},s=!a(function(){return o(Object.preventExtensions({}))}),l=function(e){n(e,t,{value:{i:"O"+ ++i,w:{}}})},c=e.exports={KEY:t,NEED:!1,fastKey:function(e,n){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!y(e,t)){if(!o(e))return"F";if(!n)return"E";l(e)}return e[t].i},getWeak:function(e,n){if(!y(e,t)){if(!o(e))return!0;if(!n)return!1;l(e)}return e[t].w},onFreeze:function(e){return s&&c.NEED&&o(e)&&!y(e,t)&&l(e),e}}}),mt=(gt.KEY,gt.NEED,gt.fastKey,gt.getWeak,gt.onFreeze,function(e,t){if(!r(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}),vt=p.f,yt=gt.fastKey,bt=s?"_s":"size",wt=function(e,t){var n,i=yt(t);if("F"!==i)return e._i[i];for(n=e._f;n;n=n.n)if(n.k==t)return n},kt={getConstructor:function(e,t,n,i){var r=e(function(e,o){F(e,r,t,"_i"),e._t=t,e._i=Be(null),e._f=void 0,e._l=void 0,e[bt]=0,null!=o&&pt(o,n,e[i],e)});return I(r.prototype,{clear:function(){for(var e=mt(this,t),n=e._i,i=e._f;i;i=i.n)i.r=!0,i.p&&(i.p=i.p.n=void 0),delete n[i.i];e._f=e._l=void 0,e[bt]=0},delete:function(e){var n=mt(this,t),i=wt(n,e);if(i){var r=i.n,o=i.p;delete n._i[i.i],i.r=!0,o&&(o.n=r),r&&(r.p=o),n._f==i&&(n._f=r),n._l==i&&(n._l=o),n[bt]--}return!!i},forEach:function(e){mt(this,t);for(var n,i=S(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(i(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!wt(mt(this,t),e)}}),s&&vt(r.prototype,"size",{get:function(){return mt(this,t)[bt]}}),r},def:function(e,t,n){var i,r,o=wt(e,t);return o?o.v=n:(e._l=o={i:r=yt(t,!0),k:t,v:n,p:i=e._l,n:void 0,r:!1},e._f||(e._f=o),i&&(i.n=o),e[bt]++,"F"!==r&&(e._i[r]=o)),e},getEntry:wt,setStrong:function(e,t,n){it(e,t,function(e,n){this._t=mt(e,t),this._k=n,this._l=void 0},function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?$e(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,$e(1))},n?"entries":"values",!n,!0),ve(t)}},Tt=function(e,t){if(o(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")},Et={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=S(Function.call,ft.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return Tt(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:Tt},St=Et.set,_t=function(e,t,i,o,s,l){var c=n[e],u=c,f=s?"set":"add",h=u&&u.prototype,d={},p=function(e){var t=h[e];T(h,e,"delete"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return l&&!r(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof u&&(l||h.forEach&&!a(function(){(new u).entries().next()}))){var g=new u,m=g[f](l?{}:-0,1)!=g,v=a(function(){g.has(1)}),y=st(function(e){new u(e)}),b=!l&&a(function(){for(var e=new u,t=5;t--;)e[f](t,t);return!e.has(-0)});y||((u=t(function(t,n){F(t,u,e);var i=function(e,t,n){var i,o=t.constructor;return o!==n&&"function"==typeof o&&(i=o.prototype)!==n.prototype&&r(i)&&St&&St(e,i),e}(new c,t,u);return null!=n&&pt(n,s,i[f],i),i})).prototype=h,h.constructor=u),(v||b)&&(p("delete"),p("has"),s&&p("get")),(b||m)&&p(f),l&&h.clear&&delete h.clear}else u=o.getConstructor(t,e,s,f),I(u.prototype,i),gt.NEED=!0;return he(u,e),d[e]=u,P(P.G+P.W+P.F*(u!=c),d),l||o.setStrong(u,e,s),u},At=(_t("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=kt.getEntry(mt(this,"Map"),e);return t&&t.v},set:function(e,t){return kt.def(mt(this,"Map"),0===e?0:e,t)}},kt,!0),_t("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return kt.def(mt(this,"Set"),e=0===e?0:e,e)}},kt),{f:Object.getOwnPropertySymbols}),Pt=Object.assign,Mt=!Pt||a(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=Pt({},e)[n]||Object.keys(Pt({},t)).join("")!=i})?function(e,t){for(var n=se(e),i=arguments.length,r=1,o=At.f,a=ct.f;i>r;)for(var s,l=z(arguments[r++]),c=o?Ce(l).concat(o(l)):Ce(l),u=c.length,f=0;u>f;)a.call(l,s=c[f++])&&(n[s]=l[s]);return n}:Pt,Lt=gt.getWeak,xt=Ge(5),Ct=Ge(6),Ot=0,Nt=function(e){return e._l||(e._l=new jt)},jt=function(){this.a=[]},It=function(e,t){return xt(e.a,function(e){return e[0]===t})};jt.prototype={get:function(e){var t=It(this,e);if(t)return t[1]},has:function(e){return!!It(this,e)},set:function(e,t){var n=It(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=Ct(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var Ft={getConstructor:function(e,t,n,i){var o=e(function(e,r){F(e,o,t,"_i"),e._t=t,e._i=Ot++,e._l=void 0,null!=r&&pt(r,n,e[i],e)});return I(o.prototype,{delete:function(e){if(!r(e))return!1;var n=Lt(e);return!0===n?Nt(mt(this,t)).delete(e):n&&y(n,this._i)&&delete n[this._i]},has:function(e){if(!r(e))return!1;var n=Lt(e);return!0===n?Nt(mt(this,t)).has(e):n&&y(n,this._i)}}),o},def:function(e,t,n){var i=Lt(o(t),!0);return!0===i?Nt(e).set(t,n):i[e._i]=n,e},ufstore:Nt};t(function(e){var t,n=Ge(0),i=gt.getWeak,o=Object.isExtensible,s=Ft.ufstore,l={},c=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},u={get:function(e){if(r(e)){var t=i(e);return!0===t?s(mt(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return Ft.def(mt(this,"WeakMap"),e,t)}},f=e.exports=_t("WeakMap",c,u,Ft,!0,!0);a(function(){return 7!=(new f).set((Object.freeze||Object)(l),7).get(l)})&&(t=Ft.getConstructor(c,"WeakMap"),Mt(t.prototype,u),gt.NEED=!0,n(["delete","has","get","set"],function(e){var n=f.prototype,i=n[e];T(n,e,function(n,a){if(r(n)&&!o(n)){this._f||(this._f=new t);var s=this._f[e](n,a);return"set"==e?this:s}return i.call(this,n,a)})}))});_t("WeakSet",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return Ft.def(mt(this,"WeakSet"),e,!0)}},Ft,!1,!0);var Rt=(n.Reflect||{}).apply,Bt=Function.apply;P(P.S+P.F*!a(function(){Rt(function(){})}),"Reflect",{apply:function(e,t,n){var i=E(e),r=o(n);return Rt?Rt(i,t,r):Bt.call(i,t,r)}});var Dt=function(e,t,n){var i=void 0===n;switch(t.length){case 0:return i?e():e.call(n);case 1:return i?e(t[0]):e.call(n,t[0]);case 2:return i?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return i?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return i?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)},Vt=[].slice,Ut={},qt=Function.bind||function(e){var t=E(this),n=Vt.call(arguments,1),i=function(){var r=n.concat(Vt.call(arguments));return this instanceof i?function(e,t,n){if(!(t in Ut)){for(var i=[],r=0;r<t;r++)i[r]="a["+r+"]";Ut[t]=Function("F,a","return new F("+i.join(",")+")")}return Ut[t](e,n)}(t,r.length,r):Dt(t,r,e)};return r(t.prototype)&&(i.prototype=t.prototype),i},Ht=(n.Reflect||{}).construct,Wt=a(function(){function e(){}return!(Ht(function(){},[],e)instanceof e)}),zt=!a(function(){Ht(function(){})});P(P.S+P.F*(Wt||zt),"Reflect",{construct:function(e,t){E(e),o(t);var n=arguments.length<3?e:E(arguments[2]);if(zt&&!Wt)return Ht(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var i=[null];return i.push.apply(i,t),new(qt.apply(e,i))}var a=n.prototype,s=Be(r(a)?a:Object.prototype),l=Function.apply.call(e,s,t);return r(l)?l:s}}),P(P.S+P.F*a(function(){Reflect.defineProperty(p.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(e,t,n){o(e),t=h(t,!0),o(n);try{return p.f(e,t,n),!0}catch(e){return!1}}});var Kt=ft.f;P(P.S,"Reflect",{deleteProperty:function(e,t){var n=Kt(o(e),t);return!(n&&!n.configurable)&&delete e[t]}}),P(P.S,"Reflect",{get:function e(t,n){var i,a,s=arguments.length<3?t:arguments[2];return o(t)===s?t[n]:(i=ft.f(t,n))?y(i,"value")?i.value:void 0!==i.get?i.get.call(s):void 0:r(a=Ue(t))?e(a,n,s):void 0}}),P(P.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return ft.f(o(e),t)}}),P(P.S,"Reflect",{getPrototypeOf:function(e){return Ue(o(e))}}),P(P.S,"Reflect",{has:function(e,t){return t in e}});var Gt=Object.isExtensible;P(P.S,"Reflect",{isExtensible:function(e){return o(e),!Gt||Gt(e)}});var Yt=n.Reflect,Jt=Yt&&Yt.ownKeys||function(e){var t=ae.f(o(e)),n=At.f;return n?t.concat(n(e)):t};P(P.S,"Reflect",{ownKeys:Jt});var Qt=Object.preventExtensions;P(P.S,"Reflect",{preventExtensions:function(e){o(e);try{return Qt&&Qt(e),!0}catch(e){return!1}}}),P(P.S,"Reflect",{set:function e(t,n,i){var a,s,l=arguments.length<4?t:arguments[3],c=ft.f(o(t),n);if(!c){if(r(s=Ue(t)))return e(s,n,i,l);c=g(0)}if(y(c,"value")){if(!1===c.writable||!r(l))return!1;if(a=ft.f(l,n)){if(a.get||a.set||!1===a.writable)return!1;a.value=i,p.f(l,n,a)}else p.f(l,n,g(0,i));return!0}return void 0!==c.set&&(c.set.call(l,i),!0)}}),Et&&P(P.S,"Reflect",{setPrototypeOf:function(e,t){Et.check(e,t);try{return Et.set(e,t),!0}catch(e){return!1}}});var $t,Xt,Zt,en=n.process,tn=n.setImmediate,nn=n.clearImmediate,rn=n.MessageChannel,on=n.Dispatch,an=0,sn={},ln=function(){var e=+this;if(sn.hasOwnProperty(e)){var t=sn[e];delete sn[e],t()}},cn=function(e){ln.call(e.data)};tn&&nn||(tn=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return sn[++an]=function(){Dt("function"==typeof e?e:Function(e),t)},$t(an),an},nn=function(e){delete sn[e]},"process"==W(en)?$t=function(e){en.nextTick(S(ln,e,1))}:on&&on.now?$t=function(e){on.now(S(ln,e,1))}:rn?(Zt=(Xt=new rn).port2,Xt.port1.onmessage=cn,$t=S(Zt.postMessage,Zt,1)):n.addEventListener&&"function"==typeof postMessage&&!n.importScripts?($t=function(e){n.postMessage(e+"","*")},n.addEventListener("message",cn,!1)):$t="onreadystatechange"in u("script")?function(e){je.appendChild(u("script")).onreadystatechange=function(){je.removeChild(this),ln.call(e)}}:function(e){setTimeout(S(ln,e,1),0)});var un={set:tn,clear:nn},fn=un.set,hn=n.MutationObserver||n.WebKitMutationObserver,dn=n.process,pn=n.Promise,gn="process"==W(dn);function mn(e){var t,n;this.promise=new e(function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i}),this.resolve=E(t),this.reject=E(n)}var vn,yn,bn,wn,kn={f:function(e){return new mn(e)}},Tn=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},En=n.navigator,Sn=En&&En.userAgent||"",_n=un.set,An=function(){var e,t,i,r=function(){var n,r;for(gn&&(n=dn.domain)&&n.exit();e;){r=e.fn,e=e.next;try{r()}catch(n){throw e?i():t=void 0,n}}t=void 0,n&&n.enter()};if(gn)i=function(){dn.nextTick(r)};else if(!hn||n.navigator&&n.navigator.standalone)if(pn&&pn.resolve){var o=pn.resolve(void 0);i=function(){o.then(r)}}else i=function(){fn.call(n,r)};else{var a=!0,s=document.createTextNode("");new hn(r).observe(s,{characterData:!0}),i=function(){s.data=a=!a}}return function(n){var r={fn:n,next:void 0};t&&(t.next=r),e||(e=r,i()),t=r}}(),Pn=n.TypeError,Mn=n.process,Ln=Mn&&Mn.versions,xn=Ln&&Ln.v8||"",Cn=n.Promise,On="process"==Ae(Mn),Nn=function(){},jn=yn=kn.f,In=!!function(){try{var e=Cn.resolve(1),t=(e.constructor={})[ce("species")]=function(e){e(Nn,Nn)};return(On||"function"==typeof PromiseRejectionEvent)&&e.then(Nn)instanceof t&&0!==xn.indexOf("6.6")&&-1===Sn.indexOf("Chrome/66")}catch(e){}}(),Fn=function(e){var t;return!(!r(e)||"function"!=typeof(t=e.then))&&t},Rn=function(e,t){if(!e._n){e._n=!0;var n=e._c;An(function(){for(var i=e._v,r=1==e._s,o=0,a=function(t){var n,o,a,s=r?t.ok:t.fail,l=t.resolve,c=t.reject,u=t.domain;try{s?(r||(2==e._h&&Vn(e),e._h=1),!0===s?n=i:(u&&u.enter(),n=s(i),u&&(u.exit(),a=!0)),n===t.promise?c(Pn("Promise-chain cycle")):(o=Fn(n))?o.call(n,l,c):l(n)):c(i)}catch(e){u&&!a&&u.exit(),c(e)}};n.length>o;)a(n[o++]);e._c=[],e._n=!1,t&&!e._h&&Bn(e)})}},Bn=function(e){_n.call(n,function(){var t,i,r,o=e._v,a=Dn(e);if(a&&(t=Tn(function(){On?Mn.emit("unhandledRejection",o,e):(i=n.onunhandledrejection)?i({promise:e,reason:o}):(r=n.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=On||Dn(e)?2:1),e._a=void 0,a&&t.e)throw t.v})},Dn=function(e){return 1!==e._h&&0===(e._a||e._c).length},Vn=function(e){_n.call(n,function(){var t;On?Mn.emit("rejectionHandled",e):(t=n.onrejectionhandled)&&t({promise:e,reason:e._v})})},Un=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),Rn(t,!0))},qn=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw Pn("Promise can't be resolved itself");(t=Fn(e))?An(function(){var i={_w:n,_d:!1};try{t.call(e,S(qn,i,1),S(Un,i,1))}catch(e){Un.call(i,e)}}):(n._v=e,n._s=1,Rn(n,!1))}catch(e){Un.call({_w:n,_d:!1},e)}}};In||(Cn=function(e){F(this,Cn,"Promise","_h"),E(e),vn.call(this);try{e(S(qn,this,1),S(Un,this,1))}catch(e){Un.call(this,e)}},(vn=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=I(Cn.prototype,{then:function(e,t){var n=jn(ge(this,Cn));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=On?Mn.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&Rn(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),bn=function(){var e=new vn;this.promise=e,this.resolve=S(qn,e,1),this.reject=S(Un,e,1)},kn.f=jn=function(e){return e===Cn||e===wn?new bn(e):yn(e)}),P(P.G+P.W+P.F*!In,{Promise:Cn}),he(Cn,"Promise"),ve("Promise"),wn=i.Promise,P(P.S+P.F*!In,"Promise",{reject:function(e){var t=jn(this);return(0,t.reject)(e),t.promise}}),P(P.S+P.F*!In,"Promise",{resolve:function(e){return function(e,t){if(o(e),r(t)&&t.constructor===e)return t;var n=kn.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),P(P.S+P.F*!(In&&st(function(e){Cn.all(e).catch(Nn)})),"Promise",{all:function(e){var t=this,n=jn(t),i=n.resolve,r=n.reject,o=Tn(function(){var n=[],o=0,a=1;pt(e,!1,function(e){var s=o++,l=!1;n.push(void 0),a++,t.resolve(e).then(function(e){l||(l=!0,n[s]=e,--a||i(n))},r)}),--a||i(n)});return o.e&&r(o.v),n.promise},race:function(e){var t=this,n=jn(t),i=n.reject,r=Tn(function(){pt(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var Hn={f:ce},Wn=p.f,zn=function(e){var t=i.Symbol||(i.Symbol=n.Symbol||{});"_"==e.charAt(0)||e in t||Wn(t,e,{value:Hn.f(e)})},Kn=ae.f,Gn={}.toString,Yn="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Jn={f:function(e){return Yn&&"[object Window]"==Gn.call(e)?function(e){try{return Kn(e)}catch(e){return Yn.slice()}}(e):Kn(G(e))}},Qn=gt.KEY,$n=ft.f,Xn=p.f,Zn=Jn.f,ei=n.Symbol,ti=n.JSON,ni=ti&&ti.stringify,ii=ce("_hidden"),ri=ce("toPrimitive"),oi={}.propertyIsEnumerable,ai=X("symbol-registry"),si=X("symbols"),li=X("op-symbols"),ci=Object.prototype,ui="function"==typeof ei,fi=n.QObject,hi=!fi||!fi.prototype||!fi.prototype.findChild,di=s&&a(function(){return 7!=Be(Xn({},"a",{get:function(){return Xn(this,"a",{value:7}).a}})).a})?function(e,t,n){var i=$n(ci,t);i&&delete ci[t],Xn(e,t,n),i&&e!==ci&&Xn(ci,t,i)}:Xn,pi=function(e){var t=si[e]=Be(ei.prototype);return t._k=e,t},gi=ui&&"symbol"==typeof ei.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof ei},mi=function(e,t,n){return e===ci&&mi(li,t,n),o(e),t=h(t,!0),o(n),y(si,t)?(n.enumerable?(y(e,ii)&&e[ii][t]&&(e[ii][t]=!1),n=Be(n,{enumerable:g(0,!1)})):(y(e,ii)||Xn(e,ii,g(1,{})),e[ii][t]=!0),di(e,t,n)):Xn(e,t,n)},vi=function(e,t){o(e);for(var n,i=function(e){var t=Ce(e),n=At.f;if(n)for(var i,r=n(e),o=ct.f,a=0;r.length>a;)o.call(e,i=r[a++])&&t.push(i);return t}(t=G(t)),r=0,a=i.length;a>r;)mi(e,n=i[r++],t[n]);return e},yi=function(e){var t=oi.call(this,e=h(e,!0));return!(this===ci&&y(si,e)&&!y(li,e))&&(!(t||!y(this,e)||!y(si,e)||y(this,ii)&&this[ii][e])||t)},bi=function(e,t){if(e=G(e),t=h(t,!0),e!==ci||!y(si,t)||y(li,t)){var n=$n(e,t);return!n||!y(si,t)||y(e,ii)&&e[ii][t]||(n.enumerable=!0),n}},wi=function(e){for(var t,n=Zn(G(e)),i=[],r=0;n.length>r;)y(si,t=n[r++])||t==ii||t==Qn||i.push(t);return i},ki=function(e){for(var t,n=e===ci,i=Zn(n?li:G(e)),r=[],o=0;i.length>o;)!y(si,t=i[o++])||n&&!y(ci,t)||r.push(si[t]);return r};ui||(T((ei=function(){if(this instanceof ei)throw TypeError("Symbol is not a constructor!");var e=k(arguments.length>0?arguments[0]:void 0),t=function(n){this===ci&&t.call(li,n),y(this,ii)&&y(this[ii],e)&&(this[ii][e]=!1),di(this,e,g(1,n))};return s&&hi&&di(ci,e,{configurable:!0,set:t}),pi(e)}).prototype,"toString",function(){return this._k}),ft.f=bi,p.f=mi,ae.f=Jn.f=wi,ct.f=yi,At.f=ki,s&&T(ci,"propertyIsEnumerable",yi,!0),Hn.f=function(e){return pi(ce(e))}),P(P.G+P.W+P.F*!ui,{Symbol:ei});for(var Ti="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),Ei=0;Ti.length>Ei;)ce(Ti[Ei++]);for(var Si=Ce(ce.store),_i=0;Si.length>_i;)zn(Si[_i++]);P(P.S+P.F*!ui,"Symbol",{for:function(e){return y(ai,e+="")?ai[e]:ai[e]=ei(e)},keyFor:function(e){if(!gi(e))throw TypeError(e+" is not a symbol!");for(var t in ai)if(ai[t]===e)return t},useSetter:function(){hi=!0},useSimple:function(){hi=!1}}),P(P.S+P.F*!ui,"Object",{create:function(e,t){return void 0===t?Be(e):vi(Be(e),t)},defineProperty:mi,defineProperties:vi,getOwnPropertyDescriptor:bi,getOwnPropertyNames:wi,getOwnPropertySymbols:ki}),ti&&P(P.S+P.F*(!ui||a(function(){var e=ei();return"[null]"!=ni([e])||"{}"!=ni({a:e})||"{}"!=ni(Object(e))})),"JSON",{stringify:function(e){for(var t,n,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(n=t=i[1],(r(t)||void 0!==e)&&!gi(e))return We(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!gi(t))return t}),i[1]=t,ni.apply(ti,i)}}),ei.prototype[ri]||m(ei.prototype,ri,ei.prototype.valueOf),he(ei,"Symbol"),he(Math,"Math",!0),he(n.JSON,"JSON",!0);var Ai=function(e,t){var n=(i.Object||{})[e]||Object[e],r={};r[e]=t(n),P(P.S+P.F*a(function(){n(1)}),"Object",r)},Pi=gt.onFreeze;Ai("freeze",function(e){return function(t){return e&&r(t)?e(Pi(t)):t}});var Mi=gt.onFreeze;Ai("seal",function(e){return function(t){return e&&r(t)?e(Mi(t)):t}});var Li=gt.onFreeze;Ai("preventExtensions",function(e){return function(t){return e&&r(t)?e(Li(t)):t}}),Ai("isFrozen",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Ai("isSealed",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Ai("isExtensible",function(e){return function(t){return!!r(t)&&(!e||e(t))}});var xi=ft.f;Ai("getOwnPropertyDescriptor",function(){return function(e,t){return xi(G(e),t)}}),Ai("getPrototypeOf",function(){return function(e){return Ue(se(e))}}),Ai("keys",function(){return function(e){return Ce(se(e))}}),Ai("getOwnPropertyNames",function(){return Jn.f}),P(P.S+P.F,"Object",{assign:Mt});var Ci=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};P(P.S,"Object",{is:Ci});var Oi=p.f,Ni=Function.prototype,ji=/^\s*function ([^ (]*)/;"name"in Ni||s&&Oi(Ni,"name",{configurable:!0,get:function(){try{return(""+this).match(ji)[1]}catch(e){return""}}}),P(P.S,"String",{raw:function(e){for(var t=G(e.raw),n=U(t.length),i=arguments.length,r=[],o=0;n>o;)r.push(String(t[o++])),o<i&&r.push(String(arguments[o]));return r.join("")}});var Ii=String.fromCharCode,Fi=String.fromCodePoint;P(P.S+P.F*(!!Fi&&1!=Fi.length),"String",{fromCodePoint:function(e){for(var t,n=[],i=arguments.length,r=0;i>r;){if(t=+arguments[r++],Q(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?Ii(t):Ii(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}});var Ri,Bi=(Ri=!1,function(e,t){var n,i,r=String(K(e)),o=D(t),a=r.length;return o<0||o>=a?Ri?"":void 0:(n=r.charCodeAt(o))<55296||n>56319||o+1===a||(i=r.charCodeAt(o+1))<56320||i>57343?Ri?r.charAt(o):n:Ri?r.slice(o,o+2):i-56320+(n-55296<<10)+65536});P(P.P,"String",{codePointAt:function(e){return Bi(this,e)}});var Di=function(e){var t=String(K(this)),n="",i=D(e);if(i<0||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n};P(P.P,"String",{repeat:Di});var Vi=ce("match"),Ui=function(e){var t;return r(e)&&(void 0!==(t=e[Vi])?!!t:"RegExp"==W(e))},qi=function(e,t,n){if(Ui(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(K(e))},Hi=ce("match"),Wi=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[Hi]=!1,!"/./"[e](t)}catch(e){}}return!0},zi="".startsWith;P(P.P+P.F*Wi("startsWith"),"String",{startsWith:function(e){var t=qi(this,e,"startsWith"),n=U(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return zi?zi.call(t,i,n):t.slice(n,n+i.length)===i}});var Ki="".endsWith;P(P.P+P.F*Wi("endsWith"),"String",{endsWith:function(e){var t=qi(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,i=U(t.length),r=void 0===n?i:Math.min(U(n),i),o=String(e);return Ki?Ki.call(t,o,r):t.slice(r-o.length,r)===o}});P(P.P+P.F*Wi("includes"),"String",{includes:function(e){return!!~qi(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}});s&&"g"!=/./g.flags&&p.f(RegExp.prototype,"flags",{configurable:!0,get:function(){var e=o(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}});var Gi=function(e,t,n){var i=ce(e),r=n(K,i,""[e]),o=r[0],s=r[1];a(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})&&(T(String.prototype,e,o),m(RegExp.prototype,i,2==t?function(e,t){return s.call(e,this,t)}:function(e){return s.call(e,this)}))};Gi("match",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]}),Gi("replace",2,function(e,t,n){return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]}),Gi("split",2,function(e,t,n){var i=Ui,r=n,o=[].push;if("c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length){var a=void 0===/()??/.exec("")[1];n=function(e,t){var n=String(this);if(void 0===e&&0===t)return[];if(!i(e))return r.call(n,e,t);var s,l,c,u,f,h=[],d=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,g=void 0===t?4294967295:t>>>0,m=new RegExp(e.source,d+"g");for(a||(s=new RegExp("^"+m.source+"$(?!\\s)",d));(l=m.exec(n))&&!((c=l.index+l[0].length)>p&&(h.push(n.slice(p,l.index)),!a&&l.length>1&&l[0].replace(s,function(){for(f=1;f<arguments.length-2;f++)void 0===arguments[f]&&(l[f]=void 0)}),l.length>1&&l.index<n.length&&o.apply(h,l.slice(1)),u=l[0].length,p=c,h.length>=g));)m.lastIndex===l.index&&m.lastIndex++;return p===n.length?!u&&m.test("")||h.push(""):h.push(n.slice(p)),h.length>g?h.slice(0,g):h}}else"0".split(void 0,0).length&&(n=function(e,t){return void 0===e&&0===t?[]:r.call(this,e,t)});return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]}),Gi("search",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]});var Yi=function(e,t,n){t in e?p.f(e,t,g(0,n)):e[t]=n};P(P.S+P.F*!st(function(e){}),"Array",{from:function(e){var t,n,i,r,o=se(e),a="function"==typeof this?this:Array,s=arguments.length,l=s>1?arguments[1]:void 0,c=void 0!==l,u=0,f=He(o);if(c&&(l=S(l,s>2?arguments[2]:void 0,2)),null==f||a==Array&&xe(f))for(n=new a(t=U(o.length));t>u;u++)Yi(n,u,c?l(o[u],u):o[u]);else for(r=f.call(o),n=new a;!(i=r.next()).done;u++)Yi(n,u,c?dt(r,l,[i.value,u],!0):i.value);return n.length=u,n}}),P(P.S+P.F*a(function(){function e(){}return!(Array.of.call(e)instanceof e)}),"Array",{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)Yi(n,e,arguments[e++]);return n.length=t,n}}),P(P.P,"Array",{copyWithin:lt}),Qe("copyWithin");var Ji=Ge(5),Qi=!0;"find"in[]&&Array(1).find(function(){Qi=!1}),P(P.P+P.F*Qi,"Array",{find:function(e){return Ji(this,e,arguments.length>1?arguments[1]:void 0)}}),Qe("find");var $i=Ge(6),Xi=!0;"findIndex"in[]&&Array(1).findIndex(function(){Xi=!1}),P(P.P+P.F*Xi,"Array",{findIndex:function(e){return $i(this,e,arguments.length>1?arguments[1]:void 0)}}),Qe("findIndex"),P(P.P,"Array",{fill:le}),Qe("fill");var Zi=n.isFinite;P(P.S,"Number",{isFinite:function(e){return"number"==typeof e&&Zi(e)}});var er=Math.floor,tr=function(e){return!r(e)&&isFinite(e)&&er(e)===e};P(P.S,"Number",{isInteger:tr});var nr=Math.abs;P(P.S,"Number",{isSafeInteger:function(e){return tr(e)&&nr(e)<=9007199254740991}}),P(P.S,"Number",{isNaN:function(e){return e!=e}}),P(P.S,"Number",{EPSILON:Math.pow(2,-52)}),P(P.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991}),P(P.S,"Number",{MAX_SAFE_INTEGER:9007199254740991});var ir=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)},rr=Math.sqrt,or=Math.acosh;P(P.S+P.F*!(or&&710==Math.floor(or(Number.MAX_VALUE))&&or(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:ir(e-1+rr(e-1)*rr(e+1))}});var ar=Math.asinh;P(P.S+P.F*!(ar&&1/ar(0)>0),"Math",{asinh:function e(t){return isFinite(t=+t)&&0!=t?t<0?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}});var sr=Math.atanh;P(P.S+P.F*!(sr&&1/sr(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}});var lr=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};P(P.S,"Math",{cbrt:function(e){return lr(e=+e)*Math.pow(Math.abs(e),1/3)}}),P(P.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}});var cr=Math.exp;P(P.S,"Math",{cosh:function(e){return(cr(e=+e)+cr(-e))/2}});var ur=Math.expm1,fr=!ur||ur(10)>22025.465794806718||ur(10)<22025.465794806718||-2e-17!=ur(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:ur;P(P.S+P.F*(fr!=Math.expm1),"Math",{expm1:fr});var hr=Math.pow,dr=hr(2,-52),pr=hr(2,-23),gr=hr(2,127)*(2-pr),mr=hr(2,-126),vr=Math.fround||function(e){var t,n,i=Math.abs(e),r=lr(e);return i<mr?r*(i/mr/pr+1/dr-1/dr)*mr*pr:(n=(t=(1+pr/dr)*i)-(t-i))>gr||n!=n?r*(1/0):r*n};P(P.S,"Math",{fround:vr});var yr=Math.abs;P(P.S,"Math",{hypot:function(e,t){for(var n,i,r=0,o=0,a=arguments.length,s=0;o<a;)s<(n=yr(arguments[o++]))?(r=r*(i=s/n)*i+1,s=n):r+=n>0?(i=n/s)*i:n;return s===1/0?1/0:s*Math.sqrt(r)}});var br=Math.imul;P(P.S+P.F*a(function(){return-5!=br(4294967295,5)||2!=br.length}),"Math",{imul:function(e,t){var n=+e,i=+t,r=65535&n,o=65535&i;return 0|r*o+((65535&n>>>16)*o+r*(65535&i>>>16)<<16>>>0)}}),P(P.S,"Math",{log1p:ir}),P(P.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}}),P(P.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}}),P(P.S,"Math",{sign:lr});var wr=Math.exp;P(P.S+P.F*a(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(fr(e)-fr(-e))/2:(wr(e-1)-wr(-e-1))*(Math.E/2)}});var kr=Math.exp;P(P.S,"Math",{tanh:function(e){var t=fr(e=+e),n=fr(-e);return t==1/0?1:n==1/0?-1:(t-n)/(kr(e)+kr(-e))}}),P(P.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}});var Tr=$(!0);P(P.P,"Array",{includes:function(e){return Tr(this,e,arguments.length>1?arguments[1]:void 0)}}),Qe("includes");var Er=ct.f,Sr=function(e){return function(t){for(var n,i=G(t),r=Ce(i),o=r.length,a=0,s=[];o>a;)Er.call(i,n=r[a++])&&s.push(e?[n,i[n]]:i[n]);return s}},_r=Sr(!1);P(P.S,"Object",{values:function(e){return _r(e)}});var Ar=Sr(!0);P(P.S,"Object",{entries:function(e){return Ar(e)}}),P(P.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,n,i=G(e),r=ft.f,o=Jt(i),a={},s=0;o.length>s;)void 0!==(n=r(i,t=o[s++]))&&Yi(a,t,n);return a}});var Pr=function(e,t,n,i){var r=String(K(e)),o=r.length,a=void 0===n?" ":String(n),s=U(t);if(s<=o||""==a)return r;var l=s-o,c=Di.call(a,Math.ceil(l/a.length));return c.length>l&&(c=c.slice(0,l)),i?c+r:r+c};P(P.P+P.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(Sn),"String",{padStart:function(e){return Pr(this,e,arguments.length>1?arguments[1]:void 0,!0)}}),P(P.P+P.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(Sn),"String",{padEnd:function(e){return Pr(this,e,arguments.length>1?arguments[1]:void 0,!1)}});var Mr=[].slice,Lr=/MSIE .\./.test(Sn),xr=function(e){return function(t,n){var i=arguments.length>2,r=!!i&&Mr.call(arguments,2);return e(i?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};P(P.G+P.B+P.F*Lr,{setTimeout:xr(n.setTimeout),setInterval:xr(n.setInterval)}),P(P.G+P.B,{setImmediate:un.set,clearImmediate:un.clear});for(var Cr=ce("iterator"),Or=ce("toStringTag"),Nr=Pe.Array,jr={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},Ir=Ce(jr),Fr=0;Fr<Ir.length;Fr++){var Rr,Br=Ir[Fr],Dr=jr[Br],Vr=n[Br],Ur=Vr&&Vr.prototype;if(Ur&&(Ur[Cr]||m(Ur,Cr,Nr),Ur[Or]||m(Ur,Or,Br),Pe[Br]=Nr,Dr))for(Rr in rt)Ur[Rr]||T(Ur,Rr,rt[Rr],!0)}t(function(t){!function(e){var n,i=Object.prototype,r=i.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",s=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag",c=e.regeneratorRuntime;if(c)t.exports=c;else{(c=e.regeneratorRuntime=t.exports).wrap=b;var u="suspendedStart",f="suspendedYield",h="executing",d="completed",p={},g={};g[a]=function(){return this};var m=Object.getPrototypeOf,v=m&&m(m(x([])));v&&v!==i&&r.call(v,a)&&(g=v);var y=E.prototype=k.prototype=Object.create(g);T.prototype=y.constructor=E,E.constructor=T,E[l]=T.displayName="GeneratorFunction",c.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===T||"GeneratorFunction"===(t.displayName||t.name))},c.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,E):(e.__proto__=E,l in e||(e[l]="GeneratorFunction")),e.prototype=Object.create(y),e},c.awrap=function(e){return{__await:e}},S(_.prototype),_.prototype[s]=function(){return this},c.AsyncIterator=_,c.async=function(e,t,n,i){var r=new _(b(e,t,n,i));return c.isGeneratorFunction(t)?r:r.next().then(function(e){return e.done?e.value:r.next()})},S(y),y[l]="Generator",y[a]=function(){return this},y.toString=function(){return"[object Generator]"},c.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var i=t.pop();if(i in e)return n.value=i,n.done=!1,n}return n.done=!0,n}},c.values=x,L.prototype={constructor:L,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method="next",this.arg=n,this.tryEntries.forEach(M),!e)for(var t in this)"t"===t.charAt(0)&&r.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=n)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function i(i,r){return s.type="throw",s.arg=e,t.next=i,r&&(t.method="next",t.arg=n),!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],s=a.completion;if("root"===a.tryLoc)return i("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),c=r.call(a,"finallyLoc");if(l&&c){if(this.prev<a.catchLoc)return i(a.catchLoc,!0);if(this.prev<a.finallyLoc)return i(a.finallyLoc)}else if(l){if(this.prev<a.catchLoc)return i(a.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return i(a.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev<i.finallyLoc){var o=i;break}}o&&("break"===e||"continue"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=e,a.arg=t,o?(this.method="next",this.next=o.finallyLoc,p):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),M(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var r=i.arg;M(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,i){return this.delegate={iterator:x(e),resultName:t,nextLoc:i},"next"===this.method&&(this.arg=n),p}}}function b(e,t,n,i){var r=t&&t.prototype instanceof k?t:k,o=Object.create(r.prototype),a=new L(i||[]);return o._invoke=function(e,t,n){var i=u;return function(r,o){if(i===h)throw new Error("Generator is already running");if(i===d){if("throw"===r)throw o;return C()}for(n.method=r,n.arg=o;;){var a=n.delegate;if(a){var s=A(a,n);if(s){if(s===p)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(i===u)throw i=d,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);i=h;var l=w(e,t,n);if("normal"===l.type){if(i=n.done?d:f,l.arg===p)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(i=d,n.method="throw",n.arg=l.arg)}}}(e,n,a),o}function w(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}function k(){}function T(){}function E(){}function S(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function _(t){function n(e,i,o,a){var s=w(t[e],t,i);if("throw"!==s.type){var l=s.arg,c=l.value;return c&&"object"==typeof c&&r.call(c,"__await")?Promise.resolve(c.__await).then(function(e){n("next",e,o,a)},function(e){n("throw",e,o,a)}):Promise.resolve(c).then(function(e){l.value=e,o(l)},a)}a(s.arg)}var i;"object"==typeof e.process&&e.process.domain&&(n=e.process.domain.bind(n)),this._invoke=function(e,t){function r(){return new Promise(function(i,r){n(e,t,i,r)})}return i=i?i.then(r,r):r()}}function A(e,t){var i=e.iterator[t.method];if(i===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=n,A(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var r=w(i,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,p;var o=r.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=n),t.delegate=null,p):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function P(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function M(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function L(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(P,this),this.reset(!0)}function x(e){if(e){var t=e[a];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var i=-1,o=function t(){for(;++i<e.length;)if(r.call(e,i))return t.value=e[i],t.done=!1,t;return t.value=n,t.done=!0,t};return o.next=o}}return{next:C}}function C(){return{value:n,done:!0}}}("object"==typeof e?e:"object"==typeof window?window:"object"==typeof self?self:e)});!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=function(e,t){var n,i;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),i=n.preventDefault,n.preventDefault=function(){i.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};t.prototype=window.Event.prototype,window.CustomEvent=t}}(),function(e){var t=function(){try{return!!Symbol.iterator}catch(e){return!1}}(),n=function(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t&&(n[Symbol.iterator]=function(){return n}),n},i=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},r=function(e){return decodeURIComponent(e).replace(/\+/g," ")};"URLSearchParams"in e&&"a=1"===new URLSearchParams("?a=1").toString()||function(){var o=function(e){if(Object.defineProperty(this,"_entries",{value:{}}),"string"==typeof e){if(""!==e)for(var t,n=(e=e.replace(/^\?/,"")).split("&"),i=0;i<n.length;i++)t=n[i].split("="),this.append(r(t[0]),t.length>1?r(t[1]):"")}else if(e instanceof o){var a=this;e.forEach(function(e,t){a.append(e,t)})}},a=o.prototype;a.append=function(e,t){e in this._entries?this._entries[e].push(t.toString()):this._entries[e]=[t.toString()]},a.delete=function(e){delete this._entries[e]},a.get=function(e){return e in this._entries?this._entries[e][0]:null},a.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},a.has=function(e){return e in this._entries},a.set=function(e,t){this._entries[e]=[t.toString()]},a.forEach=function(e,t){var n;for(var i in this._entries)if(this._entries.hasOwnProperty(i)){n=this._entries[i];for(var r=0;r<n.length;r++)e.call(t,n[r],i,this)}},a.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),n(e)},a.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),n(e)},a.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),n(e)},t&&(a[Symbol.iterator]=a.entries),a.toString=function(){var e=[];return this.forEach(function(t,n){e.push(i(n)+"="+i(t))}),e.join("&")},e.URLSearchParams=o}()}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var e=new URL("b","http://a");return e.pathname="c%20d","http://a/c%20d"===e.href&&e.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t));var i,r=document;if(n&&(void 0===e.location||n!==e.location.href)){(i=(r=document.implementation.createHTMLDocument("")).createElement("base")).href=n,r.head.appendChild(i);try{if(0!==i.href.indexOf(n))throw new Error(i.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var o=r.createElement("a");if(o.href=t,i&&(r.body.appendChild(o),o.href=o.href),":"===o.protocol||!/:/.test(o.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o})},i=n.prototype;["hash","host","hostname","port","protocol","search"].forEach(function(e){!function(e){Object.defineProperty(i,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)}),Object.defineProperties(i,{toString:{get:function(){var e=this;return function(){return e.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(e){this._anchorElement.href=e},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(e){this._anchorElement.pathname=e},enumerable:!0},origin:{get:function(){var e={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],t=this._anchorElement.port!=e&&""!==this._anchorElement.port;return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(t?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(e){},enumerable:!0},username:{get:function(){return""},set:function(e){},enumerable:!0},searchParams:{get:function(){var e=new URLSearchParams(this.search),t=this;return["append","delete","set"].forEach(function(n){var i=e[n];e[n]=function(){i.apply(e,arguments),t.search=e.toString()}}),e},enumerable:!0}}),n.createObjectURL=function(e){return t.createObjectURL.apply(t,arguments)},n.revokeObjectURL=function(e){return t.revokeObjectURL.apply(t,arguments)},e.URL=n}(),void 0!==e.location&&!("origin"in e.location)){var t=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:t,enumerable:!0})}catch(n){setInterval(function(){e.location.origin=t()},100)}}}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e);var qr=function(e){return null!=e?e.constructor:null},Hr=function(e,t){return Boolean(e&&t&&e instanceof t)},Wr=function(e){return null==e},zr=function(e){return qr(e)===Object},Kr=function(e){return qr(e)===String},Gr=function(e){return Array.isArray(e)},Yr=function(e){return Hr(e,NodeList)},Jr=function(e){return Wr(e)||(Kr(e)||Gr(e)||Yr(e))&&!e.length||zr(e)&&!Object.keys(e).length},Qr={nullOrUndefined:Wr,object:zr,number:function(e){return qr(e)===Number&&!Number.isNaN(e)},string:Kr,boolean:function(e){return qr(e)===Boolean},function:function(e){return qr(e)===Function},array:Gr,weakMap:function(e){return Hr(e,WeakMap)},nodeList:Yr,element:function(e){return Hr(e,Element)},textNode:function(e){return qr(e)===Text},event:function(e){return Hr(e,Event)},keyboardEvent:function(e){return Hr(e,KeyboardEvent)},cue:function(e){return Hr(e,window.TextTrackCue)||Hr(e,window.VTTCue)},track:function(e){return Hr(e,TextTrack)||!Wr(e)&&Kr(e.kind)},url:function(e){if(Hr(e,window.URL))return!0;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://"+e);try{return!Jr(new URL(t).hostname)}catch(e){return!1}},empty:Jr},$r=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function Xr(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!Qr.empty(t)&&Qr.function(n)){var s=t.split(" "),l=a;$r&&(l={passive:o,capture:a}),s.forEach(function(t){r&&r.eventListeners&&i&&r.eventListeners.push({element:e,type:t,callback:n,options:l}),e[i?"addEventListener":"removeEventListener"](t,n,l)})}}function Zr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Xr.call(this,e,t,n,!0,i,r)}function eo(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Xr.call(this,e,t,n,!1,i,r)}function to(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Xr.call(this,e,t,function o(){eo(e,t,o,i,r);for(var a=arguments.length,s=Array(a),l=0;l<a;l++)s[l]=arguments[l];n.apply(this,s)},!0,i,r)}function no(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(Qr.element(e)&&!Qr.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}}var io=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},ro=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),oo=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},ao=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],i=!0,r=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(i=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{!i&&s.return&&s.return()}finally{if(r)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();function so(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,r=e.parentNode,o=e.nextSibling;i.appendChild(e),o?r.insertBefore(i,o):r.appendChild(i)})}function lo(e,t){Qr.element(e)&&!Qr.empty(t)&&Object.entries(t).filter(function(e){var t=ao(e,2)[1];return!Qr.nullOrUndefined(t)}).forEach(function(t){var n=ao(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)})}function co(e,t,n){var i=document.createElement(e);return Qr.object(t)&&lo(i,t),Qr.string(n)&&(i.innerText=n),i}function uo(e,t,n,i){Qr.element(t)&&t.appendChild(co(e,n,i))}function fo(e){Qr.nodeList(e)||Qr.array(e)?Array.from(e).forEach(fo):Qr.element(e)&&Qr.element(e.parentNode)&&e.parentNode.removeChild(e)}function ho(e){if(Qr.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function po(e,t){return Qr.element(t)&&Qr.element(t.parentNode)&&Qr.element(e)?(t.parentNode.replaceChild(e,t),e):null}function go(e,t){if(!Qr.string(e)||Qr.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),r=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=o[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":Qr.object(i)&&Qr.string(i.class)&&(i.class+=" "+r),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}}),n}function mo(e,t){if(Qr.element(e)){var n=t;Qr.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function vo(e,t,n){if(Qr.nodeList(e))return Array.from(e).map(function(e){return vo(e,t,n)});if(Qr.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function yo(e,t){return Qr.element(e)&&e.classList.contains(t)}function bo(e,t){var n={Element:Element};return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function wo(e){return this.elements.container.querySelectorAll(e)}function ko(e){return this.elements.container.querySelector(e)}function To(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];Qr.element(e)&&(e.focus(),t&&vo(e,this.config.classNames.tabFocus))}var Eo,So,_o,Ao=(Eo=document.createElement("span"),So={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},_o=Object.keys(So).find(function(e){return void 0!==Eo.style[e]}),!!Qr.string(_o)&&So[_o]);function Po(e){setTimeout(function(){try{mo(e,!0),e.offsetHeight,mo(e,!1)}catch(e){}},0)}var Mo,Lo={isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)},xo={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},Co={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=Lo.isIPhone&&n&&Co.playsinline,r=Co[e]||"html5"!==t;return{api:r,ui:r&&Co.rangeInput&&("video"!==e||!Lo.isIPhone||i)}},pip:!Lo.isIPhone&&Qr.function(co("video").webkitSetPresentationMode),airplay:Qr.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=e.split("/"),n=ao(t,1)[0];if(!this.isHTML5||n!==this.type)return!1;var i=void 0;e&&e.includes("codecs=")?i=e:"audio/mpeg"===e?i="audio/mpeg;":e in xo&&(i=e+'; codecs="'+xo[e]+'"');try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(Mo=document.createElement("input"),Mo.type="range","range"===Mo.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==Ao,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},Oo={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return Co.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return Oo.getSources.call(this).map(function(e){return Number(e.getAttribute("size"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=Oo.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("size"))},set:function(t){var n=Oo.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(n){var i=e.media,r=i.currentTime,o=i.paused,a=i.preload,s=i.readyState;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",function(){e.currentTime=r,o||e.play()}),e.media.load()),no.call(e,e.media,"qualitychange",!1,{quality:t}),e.storage.set({quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(fo(Oo.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function No(e){return Qr.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function jo(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function Io(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];if(!n.length)return e;var r=n.shift();return Qr.object(r)?(Object.keys(r).forEach(function(t){Qr.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,oo({},t,{})),Io(e[t],r[t])):Object.assign(e,oo({},t,r[t]))}),Io.apply(void 0,[e].concat(n))):e}function Fo(e){for(var t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return Qr.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function Ro(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1"),"g"),n.toString())}function Bo(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function Do(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=Ro(e,"-"," "),e=Ro(e,"_"," "),Ro(e=Bo(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function Vo(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var Uo=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Qr.empty(e)||Qr.empty(t))return"";var n=jo(t.i18n,e);if(Qr.empty(n))return"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=ao(e,2),i=t[0],r=t[1];n=Ro(n,i,r)}),n},qo=function(){function e(t){io(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return ro(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(Qr.empty(n))return null;var i=JSON.parse(n);return Qr.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&Qr.object(t)){var n=this.get();Qr.empty(n)&&(n={}),Io(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function Ho(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var r=new XMLHttpRequest;if(!("withCredentials"in r))return;r.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(r.responseText))}catch(e){n(r.responseText)}else n(r.response)}),r.addEventListener("error",function(){throw new Error(r.status)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})}function Wo(e,t){if(Qr.string(e)){var n=Qr.string(t),i=function(){return null!==document.getElementById(t)},r=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var o=qo.supported,a=document.createElement("div");if(a.setAttribute("hidden",""),n&&a.setAttribute("id",t),o){var s=window.localStorage.getItem("cache-"+t);if(null!==s){var l=JSON.parse(s);r(a,l.content)}}Ho(e).then(function(e){Qr.empty(e)||(o&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),r(a,e))}).catch(function(){})}}}var zo=function(e){return parseInt(e/60/60%60,10)},Ko=function(e){return parseInt(e/60%60,10)},Go=function(e){return parseInt(e%60,10)};function Yo(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!Qr.number(e))return Yo(null,t,n);var i=function(e){return("0"+e).slice(-2)},r=zo(e),o=Ko(e),a=Go(e);return t||r>0?r+=":":r="",(n&&e>0?"-":"")+r+i(o)+":"+i(a)}var Jo={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||Lo.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=ko.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:wo.call(this,this.config.selectors.buttons.play),pause:ko.call(this,this.config.selectors.buttons.pause),restart:ko.call(this,this.config.selectors.buttons.restart),rewind:ko.call(this,this.config.selectors.buttons.rewind),fastForward:ko.call(this,this.config.selectors.buttons.fastForward),mute:ko.call(this,this.config.selectors.buttons.mute),pip:ko.call(this,this.config.selectors.buttons.pip),airplay:ko.call(this,this.config.selectors.buttons.airplay),settings:ko.call(this,this.config.selectors.buttons.settings),captions:ko.call(this,this.config.selectors.buttons.captions),fullscreen:ko.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=ko.call(this,this.config.selectors.progress),this.elements.inputs={seek:ko.call(this,this.config.selectors.inputs.seek),volume:ko.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:ko.call(this,this.config.selectors.display.buffer),currentTime:ko.call(this,this.config.selectors.display.currentTime),duration:ko.call(this,this.config.selectors.display.duration)},Qr.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=Jo.getIconUrl.call(this),i=(n.cors?"":n.url)+"#"+this.config.iconPrefix,r=document.createElementNS("http://www.w3.org/2000/svg","svg");lo(r,Io(t,{role:"presentation",focusable:"false"}));var o=document.createElementNS("http://www.w3.org/2000/svg","use"),a=i+"-"+e;return"href"in o?o.setAttributeNS("http://www.w3.org/1999/xlink","href",a):o.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",a),r.appendChild(o),r},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={pip:"PIP",airplay:"AirPlay"}[e]||Uo(e,this.config);return co("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(Qr.empty(e))return null;var t=co("span",{class:this.config.classNames.menu.value});return t.appendChild(co("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=co("button"),i=Object.assign({},t),r=Do(e),o=!1,a=void 0,s=void 0,l=void 0,c=void 0;switch("type"in i||(i.type="button"),"class"in i?i.class.includes(this.config.classNames.control)||(i.class+=" "+this.config.classNames.control):i.class=this.config.classNames.control,e){case"play":o=!0,a="play",l="pause",s="play",c="pause";break;case"mute":o=!0,a="mute",l="unmute",s="volume",c="muted";break;case"captions":o=!0,a="enableCaptions",l="disableCaptions",s="captions-off",c="captions-on";break;case"fullscreen":o=!0,a="enterFullscreen",l="exitFullscreen",s="enter-fullscreen",c="exit-fullscreen";break;case"play-large":i.class+=" "+this.config.classNames.control+"--overlaid",r="play",a="play",s="play";break;default:a=r,s=e}return o?(n.appendChild(Jo.createIcon.call(this,c,{class:"icon--pressed"})),n.appendChild(Jo.createIcon.call(this,s,{class:"icon--not-pressed"})),n.appendChild(Jo.createLabel.call(this,l,{class:"label--pressed"})),n.appendChild(Jo.createLabel.call(this,a,{class:"label--not-pressed"}))):(n.appendChild(Jo.createIcon.call(this,s)),n.appendChild(Jo.createLabel.call(this,a))),Io(i,go(this.config.selectors.buttons[r],i)),lo(n,i),"play"===r?(Qr.array(this.elements.buttons[r])||(this.elements.buttons[r]=[]),this.elements.buttons[r].push(n)):this.elements.buttons[r]=n,n},createRange:function(e,t){var n=co("input",Io(go(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":Uo(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,Jo.updateRangeFill.call(this,n),n},createProgress:function(e,t){var n=co("progress",Io(go(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(co("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?Uo(i,this.config):"";n.innerText="% "+r.toLowerCase()}return this.elements.display[e]=n,n},createTime:function(e){var t=go(this.config.selectors.display[e]),n=co("div",Io(t,{class:(this.config.classNames.display.time+" "+(t.class?t.class:"")).trim(),"aria-label":Uo(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;Zr(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var r=bo(e,'[role="menuitemradio"]');if(!r&&[32,39].includes(i.which))Jo.showMenuPanel.call(n,t,!0);else{var o=void 0;32!==i.which&&(40===i.which||r&&39===i.which?(o=e.nextElementSibling,Qr.element(o)||(o=e.parentNode.firstElementChild)):(o=e.previousElementSibling,Qr.element(o)||(o=e.parentNode.lastElementChild)),To.call(n,o,!0))}}},!1),Zr(e,"keyup",function(e){13===e.which&&Jo.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,r=e.type,o=e.title,a=e.badge,s=void 0===a?null:a,l=e.checked,c=void 0!==l&&l,u=go(this.config.selectors.inputs[r]),f=co("button",Io(u,{type:"button",role:"menuitemradio",class:(this.config.classNames.control+" "+(u.class?u.class:"")).trim(),"aria-checked":c,value:n})),h=co("span");h.innerHTML=o,Qr.element(s)&&h.appendChild(s),f.appendChild(h),Object.defineProperty(f,"checked",{enumerable:!0,get:function(){return"true"===f.getAttribute("aria-checked")},set:function(e){e&&Array.from(f.parentNode.children).filter(function(e){return bo(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),f.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(f,"click keyup",function(e){if(!Qr.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),f.checked=!0,r){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}Jo.showMenuPanel.call(t,"home",Qr.keyboardEvent(e))}},r,!1),Jo.bindMenuItemShortcuts.call(this,f,r),i.appendChild(f)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return Qr.number(e)?Yo(e,zo(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];Qr.element(e)&&Qr.number(t)&&(e.innerText=Jo.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(Qr.element(this.elements.inputs.volume)&&Jo.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),Qr.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;Qr.element(e)&&(e.value=t,Jo.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&Qr.event(e)){var n,i,r=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,r=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&Jo.setRange.call(this,this.elements.inputs.seek,r);break;case"playing":case"progress":!function(e,n){var i=Qr.number(n)?n:0,r=Qr.element(e)?e:t.elements.display.buffer;if(Qr.element(r)){r.value=i;var o=r.getElementsByTagName("span")[0];Qr.element(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=Qr.event(e)?e.target:e;if(Qr.element(t)&&"range"===t.getAttribute("type")){if(bo(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=Jo.formatTime(this.currentTime),i=Jo.formatTime(this.duration),r=Uo("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(bo(t,this.config.selectors.inputs.volume)){var o=100*t.value;t.setAttribute("aria-valuenow",o),t.setAttribute("aria-valuetext",o.toFixed(1)+"%")}else t.setAttribute("aria-valuenow",t.value);Lo.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&Qr.element(this.elements.inputs.seek)&&Qr.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r=this.config.classNames.tooltip+"--visible",o=function(e){vo(t.elements.display.seekTooltip,r,e)};if(this.touch)o(!1);else{if(Qr.event(e))n=100/i.width*(e.pageX-i.left);else{if(!yo(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),Jo.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left=n+"%",Qr.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&o("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!Qr.element(this.elements.display.duration)&&this.config.invertTime;Jo.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||Jo.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return mo(this.elements.display.currentTime,!0),void mo(this.elements.progress,!0);Qr.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=Qr.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&Jo.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&Jo.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),Jo.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){mo(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],r=null,o=t;if("captions"===e)r=this.currentTrack;else{if(r=Qr.empty(n)?this[e]:n,Qr.empty(r)&&(r=this.config[e].default),!Qr.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '"+r+"' for "+e);if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '"+r+"' for "+e)}if(Qr.element(o)||(o=i&&i.querySelector('[role="menu"]')),Qr.element(o)){this.elements.settings.buttons[e].querySelector("."+this.config.classNames.menu.value).innerHTML=Jo.getLabel.call(this,e,r);var a=o&&o.querySelector('[value="'+r+'"]');Qr.element(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?Uo("normal",this.config):t+"&times;";case"quality":if(Qr.number(t)){var n=Uo("qualityLabel."+t,this.config);return n.length?n:t+"p"}return Bo(t);case"captions":return Xo.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(Qr.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');Qr.array(e)&&(this.options.quality=No(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!Qr.empty(this.options.quality)&&this.options.quality.length>1;if(Jo.toggleMenuButton.call(this,"quality",i),ho(n),Jo.checkMenu.call(this),i){this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){Jo.createMenuItem.call(t,{value:e,list:n,type:"quality",title:Jo.getLabel.call(t,"quality",e),badge:function(e){var n=Uo("qualityBadge."+e,t.config);return n.length?Jo.createBadge.call(t,n):null}(e)})}),Jo.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(Qr.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=Xo.getTracks.call(this),i=Boolean(n.length);if(Jo.toggleMenuButton.call(this,"captions",i),ho(t),Jo.checkMenu.call(this),i){var r=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:Xo.getLabel.call(e,n),badge:n.language&&Jo.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});r.unshift({value:-1,checked:!this.captions.toggled,title:Uo("disabled",this.config),list:t,type:"language"}),r.forEach(Jo.createMenuItem.bind(this)),Jo.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(Qr.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');Qr.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var i=!Qr.empty(this.options.speed)&&this.options.speed.length>1;Jo.toggleMenuButton.call(this,"speed",i),ho(n),Jo.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){Jo.createMenuItem.call(t,{value:e,list:n,type:"speed",title:Jo.getLabel.call(t,"speed",e)})}),Jo.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!Qr.empty(e)&&Object.values(e).some(function(e){return!e.hidden});mo(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;Qr.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');To.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(Qr.element(t)&&Qr.element(n)){var i=t.hidden,r=i;if(Qr.boolean(e))r=e;else if(Qr.keyboardEvent(e)&&27===e.which)r=!1;else if(Qr.event(e)){var o=t.contains(e.target);if(o||!o&&e.target!==n&&r)return}n.setAttribute("aria-expanded",r),mo(t,!r),vo(this.elements.container,this.config.classNames.menu.open,r),r&&Qr.keyboardEvent(e)?Jo.focusFirstMenuItem.call(this,null,!0):r||i||To.call(this,n,Qr.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return fo(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-"+this.id+"-"+t);if(Qr.element(i)){var r=i.parentNode,o=Array.from(r.children).find(function(e){return!e.hidden});if(Co.transitions&&!Co.reducedMotion){r.style.width=o.scrollWidth+"px",r.style.height=o.scrollHeight+"px";var a=Jo.getMenuSize.call(this,i);Zr.call(this,r,Ao,function t(n){n.target===r&&["width","height"].includes(n.propertyName)&&(r.style.width="",r.style.height="",eo.call(e,r,Ao,t))}),r.style.width=a.width+"px",r.style.height=a.height+"px"}mo(o,!0),mo(i,!1),Jo.focusFirstMenuItem.call(this,i,n)}},create:function(e){var t=this,n=co("div",go(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(Jo.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(Jo.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(Jo.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(Jo.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=co("div",go(this.config.selectors.progress));if(i.appendChild(Jo.createRange.call(this,"seek",{id:"plyr-seek-"+e.id})),i.appendChild(Jo.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=co("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(Jo.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(Jo.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var o=co("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&o.appendChild(Jo.createButton.call(this,"mute")),this.config.controls.includes("volume")){var a={max:1,step:.05,value:this.config.volume};o.appendChild(Jo.createRange.call(this,"volume",Io(a,{id:"plyr-volume-"+e.id}))),this.elements.volume=o}n.appendChild(o)}if(this.config.controls.includes("captions")&&n.appendChild(Jo.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!Qr.empty(this.config.settings)){var s=co("div",{class:"plyr__menu",hidden:""});s.appendChild(Jo.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var l=co("div",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:""}),c=co("div"),u=co("div",{id:"plyr-settings-"+e.id+"-home"}),f=co("div",{role:"menu"});u.appendChild(f),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=co("button",Io(go(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",role:"menuitem","aria-haspopup":!0,hidden:""}));Jo.bindMenuItemShortcuts.call(t,i,n),Zr(i,"click",function(){Jo.showMenuPanel.call(t,n,!1)});var r=co("span",null,Uo(n,t.config)),o=co("span",{class:t.config.classNames.menu.value});o.innerHTML=e[n],r.appendChild(o),i.appendChild(r),f.appendChild(i);var a=co("div",{id:"plyr-settings-"+e.id+"-"+n,hidden:""}),s=co("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back"});s.appendChild(co("span",{"aria-hidden":!0},Uo(n,t.config))),s.appendChild(co("span",{class:t.config.classNames.hidden},Uo("menuBack",t.config))),Zr(a,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),Jo.showMenuPanel.call(t,"home",!0))},!1),Zr(s,"click",function(){Jo.showMenuPanel.call(t,"home",!1)}),a.appendChild(s),a.appendChild(co("div",{role:"menu"})),c.appendChild(a),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=a}),l.appendChild(c),s.appendChild(l),n.appendChild(s),this.elements.settings.popup=l,this.elements.settings.menu=s}return this.config.controls.includes("pip")&&Co.pip&&n.appendChild(Jo.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&Co.airplay&&n.appendChild(Jo.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(Jo.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(Jo.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&Jo.setQualityMenu.call(this,Oo.getQualityOptions.call(this)),Jo.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=Jo.getIconUrl.call(this);t.cors&&Wo(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},r=!0;Qr.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this.props)),this.config.controls||(this.config.controls=[]),Qr.element(this.config.controls)||Qr.string(this.config.controls)?n=this.config.controls:(n=Jo.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:Xo.getLabel.call(this)}),r=!1);var o=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=ao(e,2),i=n[0],r=n[1];t=Ro(t,"{"+i+"}",r)}),t};r&&(Qr.string(this.config.controls)?n=o(n):Qr.element(n)&&(n.innerHTML=o(n.innerHTML)));var a=void 0;if(Qr.string(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),Qr.element(a)||(a=this.elements.container),a[Qr.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),Qr.element(this.elements.controls)||Jo.findElements.call(this),!Qr.empty(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return yo(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];vo(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){Qr.array(e)||Qr.nodeList(e)?Array.from(e).filter(Boolean).forEach(s):s(e)})}if(window.navigator.userAgent.includes("Edge")&&Po(a),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,f=u.controls.wrapper+" "+u.labels+" ."+c.hidden,h=wo.call(this,f);Array.from(h).forEach(function(t){vo(t,e.config.classNames.hidden,!1),vo(t,e.config.classNames.tooltip,!0)})}}};function Qo(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var n=document.createElement("a");n.href=t,t=n.href}try{return new URL(t)}catch(e){return null}}function $o(e){var t=new URLSearchParams;return Qr.object(e)&&Object.entries(e).forEach(function(e){var n=ao(e,2),i=n[0],r=n[1];t.set(i,r)}),t}var Xo={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!Co.textTracks)Qr.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&Jo.setCaptionsMenu.call(this);else{var e,t;if(Qr.element(this.elements.captions)||(this.elements.captions=co("div",go(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,Qr.element(e)&&Qr.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),Lo.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=Qo(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&Ho(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){fo(e)})})}var i=No((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),r=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===r)r=ao(i,1)[0];var o=this.storage.get("captions");if(Qr.boolean(o)||(o=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:o,language:r,languages:i}),this.isHTML5){var a=this.config.captions.update?"addtrack removetrack":"removetrack";Zr.call(this,this.media.textTracks,a,Xo.update.bind(this))}setTimeout(Xo.update.bind(this),0)}},update:function(){var e=this,t=Xo.getTracks.call(this,!0),n=this.captions,i=n.active,r=n.language,o=n.meta,a=n.currentTrackNode,s=Boolean(t.find(function(e){return e.language===r}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!o.get(e)}).forEach(function(t){e.debug.log("Track added",t),o.set(t,{default:"showing"===t.mode}),t.mode="hidden",Zr.call(e,t,"cuechange",function(){return Xo.updateCues.call(e)})}),(s&&this.language!==r||!t.includes(a))&&(Xo.setLanguage.call(this,r),Xo.toggle.call(this,i&&s)),vo(this.elements.container,this.config.classNames.captions.enabled,!Qr.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&Jo.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,r=Qr.nullOrUndefined(e)?!n:e;if(r!==n){if(t||(this.captions.active=r,this.storage.set({captions:r})),!this.language&&r&&!t){var o=Xo.getTracks.call(this),a=Xo.findTrack.call(this,[this.captions.language].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(this.captions.languages)),!0);return this.captions.language=a.language,void Xo.set.call(this,o.indexOf(a))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=r),vo(this.elements.container,i,r),this.captions.toggled=r,Jo.updateSetting.call(this,"captions"),no.call(this,this.media,r?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=Xo.getTracks.call(this);if(-1!==e)if(Qr.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=(i||{}).language;this.captions.currentTrackNode=i,Jo.updateSetting.call(this,"captions"),t||(this.captions.language=r,this.storage.set({language:r})),this.isVimeo&&this.embed.enableTextTrack(r),no.call(this,this.media,"languagechange")}Xo.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&Xo.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else Xo.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(Qr.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=Xo.getTracks.call(this),r=Xo.findTrack.call(this,[n]);Xo.set.call(this,i.indexOf(r),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Xo.getTracks.call(this),r=function(e){return Number((t.captions.meta.get(e)||{}).default)},o=Array.from(i).sort(function(e,t){return r(t)-r(e)}),a=void 0;return e.every(function(e){return!(a=o.find(function(t){return t.language===e}))}),a||(n?o[0]:void 0)},getCurrentTrack:function(){return Xo.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!Qr.track(t)&&Co.textTracks&&this.captions.toggled&&(t=Xo.getCurrentTrack.call(this)),Qr.track(t)?Qr.empty(t.label)?Qr.empty(t.language)?Uo("enabled",this.config):e.language.toUpperCase():t.label:Uo("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(Qr.element(this.elements.captions))if(Qr.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=Xo.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(Vo)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){ho(this.elements.captions);var r=co("span",go(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),no.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},Zo={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},ea={html5:"html5",youtube:"youtube",vimeo:"vimeo"},ta={audio:"audio",video:"video"};var na=function(){},ia=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];io(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return ro(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):na}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):na}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):na}}]),e}();function ra(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;Qr.element(e)&&(e.pressed=this.active),no.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),Lo.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(Qr.element(e)){var n=wo.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1];Xr.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function oa(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",vo(this.target,this.player.config.classNames.fullscreen.fallback,e),ra.call(this)}var aa=function(){function e(t){var n=this;io(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},Zr.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){ra.call(n)}),Zr.call(this.player,this.player.elements.container,"dblclick",function(e){Qr.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return ro(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),vo(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(Lo.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():e.native?this.prefix?Qr.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():oa.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(Lo.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!Qr.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else oa.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:yo(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return Lo.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(Qr.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!Qr.function(document[t+"ExitFullscreen"])&&!Qr.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function sa(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var r=new Image,o=function(){delete r.onload,delete r.onerror,(r.naturalWidth>=t?n:i)(r)};Object.assign(r,{onload:o,onerror:o,src:e})})}var la={addStyleHook:function(){vo(this.elements.container,this.config.selectors.container.replace(".",""),!0),vo(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void la.toggleNativeControls.call(this,!0);Qr.element(this.elements.controls)||(Jo.inject.call(this),this.listeners.controls()),la.toggleNativeControls.call(this),this.isHTML5&&Xo.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,Jo.updateVolume.call(this),Jo.timeUpdate.call(this),la.checkPlaying.call(this),vo(this.elements.container,this.config.classNames.pip.supported,Co.pip&&this.isHTML5&&this.isVideo),vo(this.elements.container,this.config.classNames.airplay.supported,Co.airplay&&this.isHTML5),vo(this.elements.container,this.config.classNames.isIos,Lo.isIos),vo(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){no.call(e,e.media,"ready")},0),la.setTitle.call(this),this.poster&&la.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&Jo.durationUpdate.call(this)},setTitle:function(){var e=Uo("play",this.config);if(Qr.string(this.config.title)&&!Qr.empty(this.config.title)&&(e+=", "+this.config.title),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=ko.call(this,"iframe");if(!Qr.element(t))return;var n=Qr.empty(this.config.title)?"video":this.config.title,i=Uo("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){vo(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):Zr.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return sa(e)}).catch(function(n){throw e===t.poster&&la.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),la.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;vo(this.elements.container,this.config.classNames.playing,this.playing),vo(this.elements.container,this.config.classNames.paused,this.paused),vo(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),Qr.event(e)&&"timeupdate"===e.type||la.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){vo(t.elements.container,t.config.classNames.loading,t.loading),la.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},ca=function(){function e(t){io(this,e),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return ro(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,r="keydown"===e.type,o=r&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&Qr.number(i)){if(r){var a=document.activeElement;if(Qr.element(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&bo(a,s))return;if(32===e.which&&bo(a,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:o||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:o||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:o||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:o||t.toggleCaptions();break;case 76:t.loop=!t.loop}!t.fullscreen.enabled&&t.fullscreen.active&&27===i&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){Jo.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,vo(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,r=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||r)i=t.config.classNames.tabFocus,vo(wo.call(t,"."+i),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&vo(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&Xr.call(t,window,"keydown keyup",this.handleKey,e,!1),Xr.call(t,document.body,"click",this.toggleMenu,e),to.call(t,document.body,"touchstart",this.firstTouch),Xr.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.elements;!e.config.keyboard.global&&e.config.keyboard.focused&&Zr.call(e,t.container,"keydown keyup",this.handleKey,!1),Zr.call(e,t.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(n){var i=t.controls;i&&"enterfullscreen"===n.type&&(i.pressed=!1,i.hover=!1);var r=0;["touchstart","touchmove","mousemove"].includes(n.type)&&(la.toggleControls.call(e,!0),r=e.touch?3e3:2e3),clearTimeout(e.timers.controls),e.timers.controls=setTimeout(function(){return la.toggleControls.call(e,!1)},r)})}},{key:"media",value:function(){var e=this.player,t=e.elements;if(Zr.call(e,e.media,"timeupdate seeking seeked",function(t){return Jo.timeUpdate.call(e,t)}),Zr.call(e,e.media,"durationchange loadeddata loadedmetadata",function(t){return Jo.durationUpdate.call(e,t)}),Zr.call(e,e.media,"canplay",function(){mo(t.volume,!e.hasAudio),mo(t.buttons.mute,!e.hasAudio)}),Zr.call(e,e.media,"ended",function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&e.restart()}),Zr.call(e,e.media,"progress playing seeking seeked",function(t){return Jo.updateProgress.call(e,t)}),Zr.call(e,e.media,"volumechange",function(t){return Jo.updateVolume.call(e,t)}),Zr.call(e,e.media,"playing play pause ended emptied timeupdate",function(t){return la.checkPlaying.call(e,t)}),Zr.call(e,e.media,"waiting canplay seeked playing",function(t){return la.checkLoading.call(e,t)}),Zr.call(e,e.media,"playing",function(){e.ads&&e.ads.enabled&&!e.ads.initialized&&e.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.play()})}),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var n=ko.call(e,"."+e.config.classNames.video);if(!Qr.element(n))return;Zr.call(e,t.container,"click touchstart",function(i){([t.container,n].includes(i.target)||n.contains(i.target))&&(e.config.hideControls&&e.touch&&yo(t.container,e.config.classNames.hideControls)||(e.ended?(e.restart(),e.play()):e.togglePlay()))})}e.supported.ui&&e.config.disableContextMenu&&Zr.call(e,t.wrapper,"contextmenu",function(e){e.preventDefault()},!1),Zr.call(e,e.media,"volumechange",function(){e.storage.set({volume:e.volume,muted:e.muted})}),Zr.call(e,e.media,"ratechange",function(){Jo.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),Zr.call(e,e.media,"qualitychange",function(t){Jo.updateSetting.call(e,"quality",null,t.detail.quality)});var i=e.config.events.concat(["keyup","keydown"]).join(" ");Zr.call(e,e.media,i,function(n){var i=n.detail,r=void 0===i?{}:i;"error"===n.type&&(r=e.media.error),no.call(e,t.container,n.type,!0,r)})}},{key:"proxy",value:function(e,t,n){var i=this.player,r=i.config.listeners[n],o=!0;Qr.function(r)&&(o=r.call(i,e)),o&&Qr.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var r=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=this.player,s=a.config.listeners[i],l=Qr.function(s);Zr.call(a,e,t,function(e){return r.proxy(e,n,i)},o&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=Lo.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),Jo.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),Jo.toggleMenu.call(t,e)):Jo.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&Jo.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!Qr.keyboardEvent(e)||39===i||37===i){var r=n.hasAttribute("play-on-seeked"),o=["mouseup","touchend","keyup"].includes(e.type);r&&o?(n.removeAttribute("play-on-seeked"),t.play()):!o&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),Lo.isIos){var r=wo.call(t,'input[type="range"]');Array.from(r).forEach(function(t){return e.bind(t,i,function(e){return Po(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");Qr.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return Jo.updateSeekTooltip.call(t,e)}),Lo.isWebkit&&Array.from(wo.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return Jo.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!Qr.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,Jo.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin focusout",function(n){var i=t.config,r=t.elements,o=t.timers,a="focusin"===n.type;if(vo(r.controls,i.classNames.noTransition,a),la.toggleControls.call(t,a),a){setTimeout(function(){vo(r.controls,i.classNames.noTransition,!1)},0);var s=e.touch?3e3:4e3;clearTimeout(o.controls),o.controls=setTimeout(function(){return la.toggleControls.call(t,!1)},s)}}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=[e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),r=ao(i,2),o=r[0],a=r[1],s=Math.sign(Math.abs(o)>Math.abs(a)?o:a);t.increaseVolume(s/50);var l=t.media.volume;(1===s&&l<1||-1===s&&l>0)&&e.preventDefault()},"volume",!1)}}]),e}(),ua=t(function(e,t){var n;n=function(){var e=function(){},t={},n={},i={};function r(e,t){if(e){var r=i[e];if(n[e]=t,r)for(;r.length;)r[0](e,t),r.splice(0,1)}}function o(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function a(t,n,i,r){var o,s,l=document,c=i.async,u=(i.numRetries||0)+1,f=i.before||e,h=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(t)?(o=!0,(s=l.createElement("link")).rel="stylesheet",s.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(s=l.createElement("img")).src=h:((s=l.createElement("script")).src=t,s.async=void 0===c||c),s.onload=s.onerror=s.onbeforeload=function(e){var l=e.type[0];if(o&&"hideFocus"in s)try{s.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(r+=1)<u)return a(t,n,i,r);n(t,l,e.defaultPrevented)},!1!==f(t,s)&&l.head.appendChild(s)}function s(e,n,i){var s,l;if(n&&n.trim&&(s=n),l=(s?i:n)||{},s){if(s in t)throw"LoadJS";t[s]=!0}!function(e,t,n){var i,r,o=(e=e.push?e:[e]).length,s=o,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--o||t(l)},r=0;r<s;r++)a(e[r],i,n)}(e,function(e){o(l,e),r(s,e)},l)}return s.ready=function(e,t){return function(e,t){e=e.push?e:[e];var r,o,a,s=[],l=e.length,c=l;for(r=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)o=e[l],(a=n[o])?r(o,a):(i[o]=i[o]||[]).push(r)}(e,function(e){o(t,e)}),s},s.done=function(e){r(e,[])},s.reset=function(){t={},n={},i={}},s.isDefined=function(e){return e in t},s},e.exports=n()});function fa(e){return new Promise(function(t,n){ua(e,{success:t,error:n})})}function ha(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,no.call(this,this.media,e?"play":"pause"))}var da={setup:function(){var e=this;vo(this.elements.wrapper,this.config.classNames.embed,!0),da.setAspectRatio.call(this),Qr.object(window.Vimeo)?da.ready.call(this):fa(this.config.urls.vimeo.sdk).then(function(){da.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=(Qr.string(e)?e:this.config.ratio).split(":"),n=ao(t,2),i=100/n[0]*n[1];if(this.elements.wrapper.style.paddingBottom=i+"%",this.supported.ui){var r=(240-i)/4.8;this.media.style.transform="translateY(-"+r+"%)"}},ready:function(){var e=this,t=this,n=$o({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),i=t.media.getAttribute("src");Qr.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var r,o=(r=i,Qr.empty(r)?null:Qr.number(Number(r))?r:r.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:r),a=co("iframe"),s=Fo(t.config.urls.vimeo.iframe,o,n);a.setAttribute("src",s),a.setAttribute("allowfullscreen",""),a.setAttribute("allowtransparency",""),a.setAttribute("allow","autoplay");var l=co("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(a),t.media=po(l,t.media),Ho(Fo(t.config.urls.vimeo.api,o),"json").then(function(e){if(!Qr.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname=n.pathname.split("_")[0]+".jpg",la.setPoster.call(t,n.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(a,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return ha.call(t,!0),t.embed.play()},t.media.pause=function(){return ha.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var n=t.embed,i=t.media,r=t.paused,o=t.volume,a=r&&!n.hasPlayed;i.seeking=!0,no.call(t,i,"seeking"),Promise.resolve(a&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return a&&n.pause()}).then(function(){return a&&n.setVolume(o)}).catch(function(){})}});var u=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return u},set:function(e){t.embed.setPlaybackRate(e).then(function(){u=e,no.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&Jo.setSpeedMenu.call(t,[])})}});var f=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return f},set:function(e){t.embed.setVolume(e).then(function(){f=e,no.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!Qr.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,no.call(t,t.media,"volumechange")})}});var d=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return d},set:function(e){var n=Qr.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){d=n})}});var p=void 0;t.embed.getVideoUrl().then(function(e){p=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return p}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var n=function(e,t){var n=function e(t,n){return 0===n?t:e(n,t%n)}(e,t);return e/n+":"+t/n}(t[0],t[1]);da.setAspectRatio.call(e,n)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,la.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,no.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,no.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,Xo.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return t=e.text,n=document.createDocumentFragment(),i=document.createElement("div"),n.appendChild(i),i.innerHTML=t,n.firstChild.innerText;var t,n,i});Xo.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){ha.call(t,!e),e||no.call(t,t.media,"playing")}),Qr.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){ha.call(t,!0),no.call(t,t.media,"playing")}),t.embed.on("pause",function(){ha.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,no.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,no.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&no.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,no.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,no.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,no.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,no.call(t,t.media,"error")}),setTimeout(function(){return la.build.call(t)},0)}};function pa(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,no.call(this,this.media,e?"play":"pause"))}var ga,ma={setup:function(){var e=this;vo(this.elements.wrapper,this.config.classNames.embed,!0),ma.setAspectRatio.call(this),Qr.object(window.YT)&&Qr.function(window.YT.Player)?ma.ready.call(this):(fa(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){ma.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(Qr.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(Qr.empty(n))return this.config.title=n,void la.setTitle.call(this)}var i=this.config.keys.google;Qr.string(i)&&!Qr.empty(i)&&Ho(Fo(this.config.urls.youtube.api,e,i)).then(function(e){Qr.object(e)&&(t.config.title=e.items[0].snippet.title,la.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(Qr.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");Qr.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,r=(i=n,Qr.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),o=e.provider+"-"+Math.floor(1e4*Math.random()),a=co("div",{id:o,poster:e.poster});e.media=po(a,e.media);var s=function(e){return"https://img.youtube.com/vi/"+r+"/"+e+"default.jpg"};sa(s("maxres"),121).catch(function(){return sa(s("sd"),121)}).catch(function(){return sa(s("hq"))}).then(function(t){return la.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(o,{videoId:r,playerVars:{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!e.media.error){var n=t.data,i={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},no.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),no.call(e,e.media,"ratechange")},onReady:function(t){if(!Qr.function(e.media.play)){var n=t.target;ma.getTitle.call(e,r),e.media.play=function(){pa.call(e,!0),n.playVideo()},e.media.pause=function(){pa.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,no.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),no.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var i=Qr.boolean(t)?t:o;o=i,n[i?"mute":"unMute"](),no.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),no.call(e,e.media,"timeupdate"),no.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&no.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),no.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return la.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,no.call(e,e.media,"seeked")),t.data){case-1:no.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),no.call(e,e.media,"progress");break;case 0:pa.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):no.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(pa.call(e,!0),no.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){no.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),no.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),pa.call(e,!1)}no.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},va={setup:function(){this.media?(vo(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),vo(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&vo(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=co("div",{class:this.config.classNames.video}),so(this.media,this.elements.wrapper),this.elements.poster=co("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Oo.extend.call(this):this.isYouTube?ma.setup.call(this):this.isVimeo&&da.setup.call(this)):this.debug.warn("No media element found!")}},ya=function(){function e(t){var n=this;io(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){n.on("loaded",e),n.on("error",t)}),this.load()}return ro(e,[{key:"load",value:function(){var e=this;this.enabled&&(Qr.object(window.google)&&Qr.object(window.google.ima)?this.ready():fa(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=co("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=Yo(Math.max(e.manager.getRemainingTime(),0)),n=Uo("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),Qr.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(Qr.element(n)){var i=100/t.player.duration*e,r=co("span",{class:t.player.config.classNames.cues});r.style.left=i.toString()+"%",n.appendChild(r)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),r=function(e){var n="ads"+e.replace(/_/g,"").toLowerCase();no.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),r(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:r(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:r(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:r(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:r(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,n=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return n=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;Qr.empty(e.cuePoints)||e.cuePoints.forEach(function(i,r){n<i&&i<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var o=this.events[e];Qr.array(o)&&o.forEach(function(e){Qr.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return Qr.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){Qr.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.ads.enabled&&!Qr.empty(this.publisherId)}},{key:"tagUrl",get:function(){return"https://go.aniview.com/api/adserver6/vast/?"+$o({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId})}}]),e}(),ba={insertElements:function(e,t){var n=this;Qr.string(t)?uo(e,this.media,{src:t}):Qr.array(t)&&t.forEach(function(t){uo(e,n.media,t)})},change:function(e){var t=this;jo(e,"sources.length")?(Oo.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],fo(t.media),t.media=null,Qr.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=ao(n,1)[0],o=r.provider,a=void 0===o?ea.html5:o,s=r.src,l="html5"===a?i:"div",c="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:i,supported:Co.check(i,a,t.config.playsinline),media:co(l,c)}),t.elements.container.appendChild(t.media),Qr.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),Qr.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),la.addStyleHook.call(t),t.isHTML5&&ba.insertElements.call(t,"source",n),t.config.title=e.title,va.setup.call(t),t.isHTML5&&("tracks"in e&&ba.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&la.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},wa=function(){function e(t,n){var i=this;if(io(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=Co.touch,this.media=t,Qr.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||Qr.nodeList(this.media)||Qr.array(this.media))&&(this.media=this.media[0]),this.config=Io({},Zo,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new ia(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",Co),!Qr.nullOrUndefined(this.media)&&Qr.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(Co.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var o=this.media.tagName.toLowerCase(),a=null,s=null;switch(o){case"div":if(a=this.media.querySelector("iframe"),Qr.element(a)){if(s=Qo(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?ea.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?ea.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",s.search.length){var l=["1","true"];l.includes(s.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(s.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=l.includes(s.searchParams.get("playsinline")),this.config.hl=s.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(Qr.empty(this.provider)||!Object.keys(ea).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=ta.video;break;case"video":case"audio":this.type=o,this.provider=ea.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=Co.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new ca(this),this.storage=new qo(this),this.media.plyr=this,Qr.element(this.elements.container)||(this.elements.container=co("div"),so(this.media,this.elements.container)),la.addStyleHook.call(this),va.setup.call(this),this.config.debug&&Zr.call(this,this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&la.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new aa(this),this.config.ads.enabled&&(this.ads=new ya(this)),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return ro(e,[{key:"play",value:function(){return Qr.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&Qr.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(Qr.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):Qr.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(Qr.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(Qr.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(Qr.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){Xo.toggle.call(this,e,!1)}},{key:"airplay",value:function(){Co.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=yo(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=vo(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!Qr.empty(this.config.settings)&&Jo.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";no.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){Zr.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){to.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){eo(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(fo(t.elements.buttons.play),fo(t.elements.captions),fo(t.elements.controls),fo(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),Qr.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,r=e.options;t.removeEventListener(n,i,r)}),this.eventListeners=[])}.call(t),po(t.elements.original,t.elements.container),no.call(t,t.elements.original,"destroyed",!0),Qr.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),la.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&Qr.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return Co.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===ea.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===ea.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===ea.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===ta.video)}},{key:"isAudio",get:function(){return Boolean(this.type===ta.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=Qr.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return Qr.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration,n=Qr.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;Qr.string(t)&&(t=Number(t)),Qr.number(t)||(t=this.storage.get("volume")),Qr.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!Qr.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;Qr.boolean(t)||(t=this.storage.get("muted")),Qr.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;Qr.number(e)&&(t=e),Qr.number(t)||(t=this.storage.get("speed")),Qr.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!Qr.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(Qr.number);if(!n.includes(i)){var r=function(e,t){return Qr.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null}(n,i);this.debug.warn("Unsupported quality option: "+i+", using "+r+" instead"),i=r}t.selected=i,this.media.quality=i}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=Qr.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){ba.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?la.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=Qr.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){Xo.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){Xo.setLanguage.call(this,e,!1)},get:function(){return(Xo.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(Co.pip){var i=Qr.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return Co.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return Co.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return Wo(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return Qr.string(t)?i=Array.from(document.querySelectorAll(t)):Qr.nodeList(t)?i=Array.from(t):Qr.array(t)&&(i=t.filter(Qr.element)),Qr.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();return wa.defaults=(ga=Zo,JSON.parse(JSON.stringify(ga))),wa});
+"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=function(e,t){var n,i;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),i=n.preventDefault,n.preventDefault=function(){i.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};t.prototype=window.Event.prototype,window.CustomEvent=t}}();var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}!function(e){var t=function(){try{return!!Symbol.iterator}catch(e){return!1}}(),n=function(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t&&(n[Symbol.iterator]=function(){return n}),n},i=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},r=function(e){return decodeURIComponent(e).replace(/\+/g," ")};"URLSearchParams"in e&&"a=1"===new URLSearchParams("?a=1").toString()||function(){var o=function(e){if(Object.defineProperty(this,"_entries",{writable:!0,value:{}}),"string"==typeof e)""!==e&&this._fromString(e);else if(e instanceof o){var t=this;e.forEach(function(e,n){t.append(n,e)})}},a=o.prototype;a.append=function(e,t){e in this._entries?this._entries[e].push(t.toString()):this._entries[e]=[t.toString()]},a.delete=function(e){delete this._entries[e]},a.get=function(e){return e in this._entries?this._entries[e][0]:null},a.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},a.has=function(e){return e in this._entries},a.set=function(e,t){this._entries[e]=[t.toString()]},a.forEach=function(e,t){var n;for(var i in this._entries)if(this._entries.hasOwnProperty(i)){n=this._entries[i];for(var r=0;r<n.length;r++)e.call(t,n[r],i,this)}},a.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),n(e)},a.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),n(e)},a.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),n(e)},t&&(a[Symbol.iterator]=a.entries),a.toString=function(){var e=[];return this.forEach(function(t,n){e.push(i(n)+"="+i(t))}),e.join("&")},Object.defineProperty(a,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){this._entries={};for(var t,n=(e=e.replace(/^\?/,"")).split("&"),i=0;i<n.length;i++)t=n[i].split("="),this.append(r(t[0]),t.length>1?r(t[1]):"")}}),e.URLSearchParams=o}(),"function"!=typeof URLSearchParams.prototype.sort&&(URLSearchParams.prototype.sort=function(){var e=this,t=[];this.forEach(function(n,i){t.push([i,n]),e._entries||e.delete(i)}),t.sort(function(e,t){return e[0]<t[0]?-1:e[0]>t[0]?1:0}),e._entries&&(e._entries={});for(var n=0;n<t.length;n++)this.append(t[n][0],t[n][1])})}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var e=new URL("b","http://a");return e.pathname="c%20d","http://a/c%20d"===e.href&&e.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t));var i,r=document;if(n&&(void 0===e.location||n!==e.location.href)){(i=(r=document.implementation.createHTMLDocument("")).createElement("base")).href=n,r.head.appendChild(i);try{if(0!==i.href.indexOf(n))throw new Error(i.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var o=r.createElement("a");if(o.href=t,i&&(r.body.appendChild(o),o.href=o.href),":"===o.protocol||!/:/.test(o.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o});var a=new URLSearchParams(this.search),s=!0,l=!0,c=this;["append","delete","set"].forEach(function(e){var t=a[e];a[e]=function(){t.apply(a,arguments),s&&(l=!1,c.search=a.toString(),l=!0)}}),Object.defineProperty(this,"searchParams",{value:a,enumerable:!0});var u=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==u&&(u=this.search,l&&(s=!1,this.searchParams._fromString(this.search),s=!0))}})},i=n.prototype;["hash","host","hostname","port","protocol"].forEach(function(e){!function(e){Object.defineProperty(i,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)}),Object.defineProperty(i,"search",{get:function(){return this._anchorElement.search},set:function(e){this._anchorElement.search=e,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(i,{toString:{get:function(){var e=this;return function(){return e.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(e){this._anchorElement.href=e,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(e){this._anchorElement.pathname=e},enumerable:!0},origin:{get:function(){var e={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],t=this._anchorElement.port!=e&&""!==this._anchorElement.port;return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(t?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(e){},enumerable:!0},username:{get:function(){return""},set:function(e){},enumerable:!0}}),n.createObjectURL=function(e){return t.createObjectURL.apply(t,arguments)},n.revokeObjectURL=function(e){return t.revokeObjectURL.apply(t,arguments)},e.URL=n}(),void 0!==e.location&&!("origin"in e.location)){var t=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:t,enumerable:!0})}catch(n){setInterval(function(){e.location.origin=t()},100)}}}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e);var n=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},i=function(e,t,i){if(n(e),void 0===t)return e;switch(i){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},r=t(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),o=t(function(e){var t=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=t)}),a=(o.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),s=function(e){if(!a(e))throw TypeError(e+" is not an object!");return e},l=function(e){try{return!!e()}catch(e){return!0}},c=!l(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),u=r.document,d=a(u)&&a(u.createElement),h=function(e){return d?u.createElement(e):{}},f=!c&&!l(function(){return 7!=Object.defineProperty(h("div"),"a",{get:function(){return 7}}).a}),p=function(e,t){if(!a(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!a(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!a(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!a(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},m=Object.defineProperty,g={f:c?Object.defineProperty:function(e,t,n){if(s(e),t=p(t,!0),s(n),f)try{return m(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},y=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},v=c?function(e,t,n){return g.f(e,t,y(1,n))}:function(e,t,n){return e[t]=n,e},b={}.hasOwnProperty,k=function(e,t){return b.call(e,t)},w=0,T=Math.random(),E=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++w+T).toString(36))},A=t(function(e){var t=E("src"),n=Function.toString,i=(""+n).split("toString");o.inspectSource=function(e){return n.call(e)},(e.exports=function(e,n,o,a){var s="function"==typeof o;s&&(k(o,"name")||v(o,"name",n)),e[n]!==o&&(s&&(k(o,t)||v(o,t,e[n]?""+e[n]:i.join(String(n)))),e===r?e[n]=o:a?e[n]?e[n]=o:v(e,n,o):(delete e[n],v(e,n,o)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||n.call(this)})}),_=function(e,t,n){var a,s,l,c,u=e&_.F,d=e&_.G,h=e&_.S,f=e&_.P,p=e&_.B,m=d?r:h?r[t]||(r[t]={}):(r[t]||{}).prototype,g=d?o:o[t]||(o[t]={}),y=g.prototype||(g.prototype={});for(a in d&&(n=t),n)l=((s=!u&&m&&void 0!==m[a])?m:n)[a],c=p&&s?i(l,r):f&&"function"==typeof l?i(Function.call,l):l,m&&A(m,a,l,e&_.U),g[a]!=l&&v(g,a,c),f&&y[a]!=l&&(y[a]=l)};r.core=o,_.F=1,_.G=2,_.S=4,_.P=8,_.B=16,_.W=32,_.U=64,_.R=128;var S=_,P=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},C=function(e){return Object(P(e))},L=function(e,t,n,i){try{return i?t(s(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&s(r.call(e)),t}},M={},N=t(function(e){var t=r["__core-js_shared__"]||(r["__core-js_shared__"]={});(e.exports=function(e,n){return t[e]||(t[e]=void 0!==n?n:{})})("versions",[]).push({version:o.version,mode:"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})}),x=t(function(e){var t=N("wks"),n=r.Symbol,i="function"==typeof n;(e.exports=function(e){return t[e]||(t[e]=i&&n[e]||(i?n:E)("Symbol."+e))}).store=t}),O=x("iterator"),j=Array.prototype,I=function(e){return void 0!==e&&(M.Array===e||j[O]===e)},R=Math.ceil,F=Math.floor,q=function(e){return isNaN(e=+e)?0:(e>0?F:R)(e)},D=Math.min,V=function(e){return e>0?D(q(e),9007199254740991):0},B=function(e,t,n){t in e?g.f(e,t,y(0,n)):e[t]=n},H={}.toString,U=function(e){return H.call(e).slice(8,-1)},W=x("toStringTag"),z="Arguments"==U(function(){return arguments}()),K=function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),W))?n:z?U(t):"Object"==(i=U(t))&&"function"==typeof t.callee?"Arguments":i},Y=x("iterator"),G=o.getIteratorMethod=function(e){if(null!=e)return e[Y]||e["@@iterator"]||M[K(e)]},$=x("iterator"),J=!1;try{[7][$]().return=function(){J=!0}}catch(e){}var Q=function(e,t){if(!t&&!J)return!1;var n=!1;try{var i=[7],r=i[$]();r.next=function(){return{done:n=!0}},i[$]=function(){return r},e(i)}catch(e){}return n};S(S.S+S.F*!Q(function(e){}),"Array",{from:function(e){var t,n,r,o,a=C(e),s="function"==typeof this?this:Array,l=arguments.length,c=l>1?arguments[1]:void 0,u=void 0!==c,d=0,h=G(a);if(u&&(c=i(c,l>2?arguments[2]:void 0,2)),null==h||s==Array&&I(h))for(n=new s(t=V(a.length));t>d;d++)B(n,d,u?c(a[d],d):a[d]);else for(o=h.call(a),n=new s;!(r=o.next()).done;d++)B(n,d,u?L(o,c,[r.value,d],!0):r.value);return n.length=d,n}});var X=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==U(e)?e.split(""):Object(e)},Z=Array.isArray||function(e){return"Array"==U(e)},ee=x("species"),te=function(e,t){return new(function(e){var t;return Z(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!Z(t.prototype)||(t=void 0),a(t)&&null===(t=t[ee])&&(t=void 0)),void 0===t?Array:t}(e))(t)},ne=function(e,t){var n=1==e,r=2==e,o=3==e,a=4==e,s=6==e,l=5==e||s,c=t||te;return function(t,u,d){for(var h,f,p=C(t),m=X(p),g=i(u,d,3),y=V(m.length),v=0,b=n?c(t,y):r?c(t,0):void 0;y>v;v++)if((l||v in m)&&(f=g(h=m[v],v,p),e))if(n)b[v]=f;else if(f)switch(e){case 3:return!0;case 5:return h;case 6:return v;case 2:b.push(h)}else if(a)return!1;return s?-1:o||a?a:b}},ie=x("unscopables"),re=Array.prototype;null==re[ie]&&v(re,ie,{});var oe=function(e){re[ie][e]=!0},ae=ne(5),se=!0;"find"in[]&&Array(1).find(function(){se=!1}),S(S.P+S.F*se,"Array",{find:function(e){return ae(this,e,arguments.length>1?arguments[1]:void 0)}}),oe("find");var le={f:{}.propertyIsEnumerable},ce=function(e){return X(P(e))},ue=Object.getOwnPropertyDescriptor,de={f:c?ue:function(e,t){if(e=ce(e),t=p(t,!0),f)try{return ue(e,t)}catch(e){}if(k(e,t))return y(!le.f.call(e,t),e[t])}},he=function(e,t){if(s(e),!a(t)&&null!==t)throw TypeError(t+": can't set as prototype!")},fe={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=i(Function.call,de.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return he(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:he}.set,pe=function(e,t,n){var i,r=t.constructor;return r!==n&&"function"==typeof r&&(i=r.prototype)!==n.prototype&&a(i)&&fe&&fe(e,i),e},me=Math.max,ge=Math.min,ye=function(e){return function(t,n,i){var r,o=ce(t),a=V(o.length),s=function(e,t){return(e=q(e))<0?me(e+t,0):ge(e,t)}(i,a);if(e&&n!=n){for(;a>s;)if((r=o[s++])!=r)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},ve=N("keys"),be=function(e){return ve[e]||(ve[e]=E(e))},ke=ye(!1),we=be("IE_PROTO"),Te=function(e,t){var n,i=ce(e),r=0,o=[];for(n in i)n!=we&&k(i,n)&&o.push(n);for(;t.length>r;)k(i,n=t[r++])&&(~ke(o,n)||o.push(n));return o},Ee="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),Ae=Ee.concat("length","prototype"),_e={f:Object.getOwnPropertyNames||function(e){return Te(e,Ae)}},Se="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff",Pe="["+Se+"]",Ce=RegExp("^"+Pe+Pe+"*"),Le=RegExp(Pe+Pe+"*$"),Me=function(e,t,n){var i={},r=l(function(){return!!Se[e]()||"​…"!="​…"[e]()}),o=i[e]=r?t(Ne):Se[e];n&&(i[n]=o),S(S.P+S.F*r,"String",i)},Ne=Me.trim=function(e,t){return e=String(P(e)),1&t&&(e=e.replace(Ce,"")),2&t&&(e=e.replace(Le,"")),e},xe=Me,Oe=Object.keys||function(e){return Te(e,Ee)},je=c?Object.defineProperties:function(e,t){s(e);for(var n,i=Oe(t),r=i.length,o=0;r>o;)g.f(e,n=i[o++],t[n]);return e},Ie=r.document,Re=Ie&&Ie.documentElement,Fe=be("IE_PROTO"),qe=function(){},De=function(){var e,t=h("iframe"),n=Ee.length;for(t.style.display="none",Re.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),De=e.F;n--;)delete De.prototype[Ee[n]];return De()},Ve=Object.create||function(e,t){var n;return null!==e?(qe.prototype=s(e),n=new qe,qe.prototype=null,n[Fe]=e):n=De(),void 0===t?n:je(n,t)},Be=_e.f,He=de.f,Ue=g.f,We=xe.trim,ze=r.Number,Ke=ze,Ye=ze.prototype,Ge="Number"==U(Ve(Ye)),$e="trim"in String.prototype,Je=function(e){var t=p(e,!1);if("string"==typeof t&&t.length>2){var n,i,r,o=(t=$e?t.trim():We(t,3)).charCodeAt(0);if(43===o||45===o){if(88===(n=t.charCodeAt(2))||120===n)return NaN}else if(48===o){switch(t.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+t}for(var a,s=t.slice(2),l=0,c=s.length;l<c;l++)if((a=s.charCodeAt(l))<48||a>r)return NaN;return parseInt(s,i)}}return+t};if(!ze(" 0o1")||!ze("0b1")||ze("+0x1")){ze=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof ze&&(Ge?l(function(){Ye.valueOf.call(n)}):"Number"!=U(n))?pe(new Ke(Je(t)),n,ze):Je(t)};for(var Qe,Xe=c?Be(Ke):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Ze=0;Xe.length>Ze;Ze++)k(Ke,Qe=Xe[Ze])&&!k(ze,Qe)&&Ue(ze,Qe,He(Ke,Qe));ze.prototype=Ye,Ye.constructor=ze,A(r,"Number",ze)}!function(e,t){var n=(o.Object||{})[e]||Object[e],i={};i[e]=t(n),S(S.S+S.F*l(function(){n(1)}),"Object",i)}("keys",function(){return function(e){return Oe(C(e))}});var et=x("match"),tt=function(e){var t;return a(e)&&(void 0!==(t=e[et])?!!t:"RegExp"==U(e))},nt=function(e,t,n){if(tt(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(P(e))},it=x("match"),rt=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[it]=!1,!"/./"[e](t)}catch(e){}}return!0};S(S.P+S.F*rt("includes"),"String",{includes:function(e){return!!~nt(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}});var ot=ye(!0);S(S.P,"Array",{includes:function(e){return ot(this,e,arguments.length>1?arguments[1]:void 0)}}),oe("includes");var at=function(e,t,n){var i=x(e),r=n(P,i,""[e]),o=r[0],a=r[1];l(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})&&(A(String.prototype,e,o),v(RegExp.prototype,i,2==t?function(e,t){return a.call(e,this,t)}:function(e){return a.call(e,this)}))};at("search",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]});var st=function(){var e=s(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};c&&"g"!=/./g.flags&&g.f(RegExp.prototype,"flags",{configurable:!0,get:st});var lt=/./.toString,ct=function(e){A(RegExp.prototype,"toString",e,!0)};l(function(){return"/a/b"!=lt.call({source:"a",flags:"b"})})?ct(function(){var e=s(this);return"/".concat(e.source,"/","flags"in e?e.flags:!c&&e instanceof RegExp?st.call(e):void 0)}):"toString"!=lt.name&&ct(function(){return lt.call(this)});var ut=function(e,t){return{value:t,done:!!e}},dt=g.f,ht=x("toStringTag"),ft=function(e,t,n){e&&!k(e=n?e:e.prototype,ht)&&dt(e,ht,{configurable:!0,value:t})},pt={};v(pt,x("iterator"),function(){return this});var mt=function(e,t,n){e.prototype=Ve(pt,{next:y(1,n)}),ft(e,t+" Iterator")},gt=be("IE_PROTO"),yt=Object.prototype,vt=Object.getPrototypeOf||function(e){return e=C(e),k(e,gt)?e[gt]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?yt:null},bt=x("iterator"),kt=!([].keys&&"next"in[].keys()),wt=function(){return this},Tt=function(e,t,n,i,r,o,a){mt(n,t,i);var s,l,c,u=function(e){if(!kt&&e in p)return p[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},d=t+" Iterator",h="values"==r,f=!1,p=e.prototype,m=p[bt]||p["@@iterator"]||r&&p[r],g=m||u(r),y=r?h?u("entries"):g:void 0,b="Array"==t&&p.entries||m;if(b&&(c=vt(b.call(new e)))!==Object.prototype&&c.next&&(ft(c,d,!0),"function"!=typeof c[bt]&&v(c,bt,wt)),h&&m&&"values"!==m.name&&(f=!0,g=function(){return m.call(this)}),(kt||f||!p[bt])&&v(p,bt,g),M[t]=g,M[d]=wt,r)if(s={values:h?g:u("values"),keys:o?g:u("keys"),entries:y},a)for(l in s)l in p||A(p,l,s[l]);else S(S.P+S.F*(kt||f),t,s);return s},Et=Tt(Array,"Array",function(e,t){this._t=ce(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,ut(1)):ut(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");M.Arguments=M.Array,oe("keys"),oe("values"),oe("entries");for(var At=x("iterator"),_t=x("toStringTag"),St=M.Array,Pt={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},Ct=Oe(Pt),Lt=0;Lt<Ct.length;Lt++){var Mt,Nt=Ct[Lt],xt=Pt[Nt],Ot=r[Nt],jt=Ot&&Ot.prototype;if(jt&&(jt[At]||v(jt,At,St),jt[_t]||v(jt,_t,Nt),M[Nt]=St,xt))for(Mt in Et)jt[Mt]||A(jt,Mt,Et[Mt],!0)}var It=function(e){return function(t,n){var i,r,o=String(P(t)),a=q(n),s=o.length;return a<0||a>=s?e?"":void 0:(i=o.charCodeAt(a))<55296||i>56319||a+1===s||(r=o.charCodeAt(a+1))<56320||r>57343?e?o.charAt(a):i:e?o.slice(a,a+2):r-56320+(i-55296<<10)+65536}}(!0);Tt(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=It(t,n),this._i+=e.length,{value:e,done:!1})});var Rt=t(function(e){var t=E("meta"),n=g.f,i=0,r=Object.isExtensible||function(){return!0},o=!l(function(){return r(Object.preventExtensions({}))}),s=function(e){n(e,t,{value:{i:"O"+ ++i,w:{}}})},c=e.exports={KEY:t,NEED:!1,fastKey:function(e,n){if(!a(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!k(e,t)){if(!r(e))return"F";if(!n)return"E";s(e)}return e[t].i},getWeak:function(e,n){if(!k(e,t)){if(!r(e))return!0;if(!n)return!1;s(e)}return e[t].w},onFreeze:function(e){return o&&c.NEED&&r(e)&&!k(e,t)&&s(e),e}}}),Ft=(Rt.KEY,Rt.NEED,Rt.fastKey,Rt.getWeak,Rt.onFreeze,{f:Object.getOwnPropertySymbols}),qt=Object.assign,Dt=!qt||l(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=qt({},e)[n]||Object.keys(qt({},t)).join("")!=i})?function(e,t){for(var n=C(e),i=arguments.length,r=1,o=Ft.f,a=le.f;i>r;)for(var s,l=X(arguments[r++]),c=o?Oe(l).concat(o(l)):Oe(l),u=c.length,d=0;u>d;)a.call(l,s=c[d++])&&(n[s]=l[s]);return n}:qt,Vt=function(e,t,n){for(var i in t)A(e,i,t[i],n);return e},Bt=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},Ht=t(function(e){var t={},n={},r=e.exports=function(e,r,o,a,l){var c,u,d,h,f=l?function(){return e}:G(e),p=i(o,a,r?2:1),m=0;if("function"!=typeof f)throw TypeError(e+" is not iterable!");if(I(f)){for(c=V(e.length);c>m;m++)if((h=r?p(s(u=e[m])[0],u[1]):p(e[m]))===t||h===n)return h}else for(d=f.call(e);!(u=d.next()).done;)if((h=L(d,p,u.value,r))===t||h===n)return h};r.BREAK=t,r.RETURN=n}),Ut=function(e,t){if(!a(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e},Wt=Rt.getWeak,zt=ne(5),Kt=ne(6),Yt=0,Gt=function(e){return e._l||(e._l=new $t)},$t=function(){this.a=[]},Jt=function(e,t){return zt(e.a,function(e){return e[0]===t})};$t.prototype={get:function(e){var t=Jt(this,e);if(t)return t[1]},has:function(e){return!!Jt(this,e)},set:function(e,t){var n=Jt(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=Kt(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var Qt={getConstructor:function(e,t,n,i){var r=e(function(e,o){Bt(e,r,t,"_i"),e._t=t,e._i=Yt++,e._l=void 0,null!=o&&Ht(o,n,e[i],e)});return Vt(r.prototype,{delete:function(e){if(!a(e))return!1;var n=Wt(e);return!0===n?Gt(Ut(this,t)).delete(e):n&&k(n,this._i)&&delete n[this._i]},has:function(e){if(!a(e))return!1;var n=Wt(e);return!0===n?Gt(Ut(this,t)).has(e):n&&k(n,this._i)}}),r},def:function(e,t,n){var i=Wt(s(t),!0);return!0===i?Gt(e).set(t,n):i[e._i]=n,e},ufstore:Gt};t(function(e){var t,n=ne(0),i=Rt.getWeak,o=Object.isExtensible,s=Qt.ufstore,c={},u=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},d={get:function(e){if(a(e)){var t=i(e);return!0===t?s(Ut(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return Qt.def(Ut(this,"WeakMap"),e,t)}},h=e.exports=function(e,t,n,i,o,s){var c=r[e],u=c,d=o?"set":"add",h=u&&u.prototype,f={},p=function(e){var t=h[e];A(h,e,"delete"==e?function(e){return!(s&&!a(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(s&&!a(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return s&&!a(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof u&&(s||h.forEach&&!l(function(){(new u).entries().next()}))){var m=new u,g=m[d](s?{}:-0,1)!=m,y=l(function(){m.has(1)}),v=Q(function(e){new u(e)}),b=!s&&l(function(){for(var e=new u,t=5;t--;)e[d](t,t);return!e.has(-0)});v||((u=t(function(t,n){Bt(t,u,e);var i=pe(new c,t,u);return null!=n&&Ht(n,o,i[d],i),i})).prototype=h,h.constructor=u),(y||b)&&(p("delete"),p("has"),o&&p("get")),(b||g)&&p(d),s&&h.clear&&delete h.clear}else u=i.getConstructor(t,e,o,d),Vt(u.prototype,n),Rt.NEED=!0;return ft(u,e),f[e]=u,S(S.G+S.W+S.F*(u!=c),f),s||i.setStrong(u,e,o),u}("WeakMap",u,d,Qt,!0,!0);l(function(){return 7!=(new h).set((Object.freeze||Object)(c),7).get(c)})&&(t=Qt.getConstructor(u,"WeakMap"),Dt(t.prototype,d),Rt.NEED=!0,n(["delete","has","get","set"],function(e){var n=h.prototype,i=n[e];A(n,e,function(n,r){if(a(n)&&!o(n)){this._f||(this._f=new t);var s=this._f[e](n,r);return"set"==e?this:s}return i.call(this,n,r)})}))});function Xt(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Zt(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function en(e,t,n){return t&&Zt(e.prototype,t),n&&Zt(e,n),e}function tn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function nn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,r=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(i=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{i||null==s.return||s.return()}finally{if(r)throw o}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function rn(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}S(S.S+S.F,"Object",{assign:Dt}),at("split",2,function(e,t,n){var i=tt,r=n,o=[].push;if("c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length){var a=void 0===/()??/.exec("")[1];n=function(e,t){var n=String(this);if(void 0===e&&0===t)return[];if(!i(e))return r.call(n,e,t);var s,l,c,u,d,h=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,m=void 0===t?4294967295:t>>>0,g=new RegExp(e.source,f+"g");for(a||(s=new RegExp("^"+g.source+"$(?!\\s)",f));(l=g.exec(n))&&!((c=l.index+l[0].length)>p&&(h.push(n.slice(p,l.index)),!a&&l.length>1&&l[0].replace(s,function(){for(d=1;d<arguments.length-2;d++)void 0===arguments[d]&&(l[d]=void 0)}),l.length>1&&l.index<n.length&&o.apply(h,l.slice(1)),u=l[0].length,p=c,h.length>=m));)g.lastIndex===l.index&&g.lastIndex++;return p===n.length?!u&&g.test("")||h.push(""):h.push(n.slice(p)),h.length>m?h.slice(0,m):h}}else"0".split(void 0,0).length&&(n=function(e,t){return void 0===e&&0===t?[]:r.call(this,e,t)});return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]});var on=le.f,an=function(e){return function(t){for(var n,i=ce(t),r=Oe(i),o=r.length,a=0,s=[];o>a;)on.call(i,n=r[a++])&&s.push(e?[n,i[n]]:i[n]);return s}},sn=an(!0);S(S.S,"Object",{entries:function(e){return sn(e)}});var ln=an(!1);S(S.S,"Object",{values:function(e){return ln(e)}}),at("replace",2,function(e,t,n){return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]});var cn,un,dn,hn=x("species"),fn=r.process,pn=r.setImmediate,mn=r.clearImmediate,gn=r.MessageChannel,yn=r.Dispatch,vn=0,bn={},kn=function(){var e=+this;if(bn.hasOwnProperty(e)){var t=bn[e];delete bn[e],t()}},wn=function(e){kn.call(e.data)};pn&&mn||(pn=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return bn[++vn]=function(){!function(e,t,n){var i=void 0===n;switch(t.length){case 0:return i?e():e.call(n);case 1:return i?e(t[0]):e.call(n,t[0]);case 2:return i?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return i?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return i?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}e.apply(n,t)}("function"==typeof e?e:Function(e),t)},cn(vn),vn},mn=function(e){delete bn[e]},"process"==U(fn)?cn=function(e){fn.nextTick(i(kn,e,1))}:yn&&yn.now?cn=function(e){yn.now(i(kn,e,1))}:gn?(dn=(un=new gn).port2,un.port1.onmessage=wn,cn=i(dn.postMessage,dn,1)):r.addEventListener&&"function"==typeof postMessage&&!r.importScripts?(cn=function(e){r.postMessage(e+"","*")},r.addEventListener("message",wn,!1)):cn="onreadystatechange"in h("script")?function(e){Re.appendChild(h("script")).onreadystatechange=function(){Re.removeChild(this),kn.call(e)}}:function(e){setTimeout(i(kn,e,1),0)});var Tn={set:pn,clear:mn},En=Tn.set,An=r.MutationObserver||r.WebKitMutationObserver,_n=r.process,Sn=r.Promise,Pn="process"==U(_n);function Cn(e){var t,i;this.promise=new e(function(e,n){if(void 0!==t||void 0!==i)throw TypeError("Bad Promise constructor");t=e,i=n}),this.resolve=n(t),this.reject=n(i)}var Ln,Mn,Nn,xn,On={f:function(e){return new Cn(e)}},jn=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},In=r.navigator,Rn=In&&In.userAgent||"",Fn=x("species"),qn=function(e){var t=r[e];c&&t&&!t[Fn]&&g.f(t,Fn,{configurable:!0,get:function(){return this}})},Dn=Tn.set,Vn=function(){var e,t,n,i=function(){var i,r;for(Pn&&(i=_n.domain)&&i.exit();e;){r=e.fn,e=e.next;try{r()}catch(i){throw e?n():t=void 0,i}}t=void 0,i&&i.enter()};if(Pn)n=function(){_n.nextTick(i)};else if(!An||r.navigator&&r.navigator.standalone)if(Sn&&Sn.resolve){var o=Sn.resolve(void 0);n=function(){o.then(i)}}else n=function(){En.call(r,i)};else{var a=!0,s=document.createTextNode("");new An(i).observe(s,{characterData:!0}),n=function(){s.data=a=!a}}return function(i){var r={fn:i,next:void 0};t&&(t.next=r),e||(e=r,n()),t=r}}(),Bn=r.TypeError,Hn=r.process,Un=Hn&&Hn.versions,Wn=Un&&Un.v8||"",zn=r.Promise,Kn="process"==K(Hn),Yn=function(){},Gn=Mn=On.f,$n=!!function(){try{var e=zn.resolve(1),t=(e.constructor={})[x("species")]=function(e){e(Yn,Yn)};return(Kn||"function"==typeof PromiseRejectionEvent)&&e.then(Yn)instanceof t&&0!==Wn.indexOf("6.6")&&-1===Rn.indexOf("Chrome/66")}catch(e){}}(),Jn=function(e){var t;return!(!a(e)||"function"!=typeof(t=e.then))&&t},Qn=function(e,t){if(!e._n){e._n=!0;var n=e._c;Vn(function(){for(var i=e._v,r=1==e._s,o=0,a=function(t){var n,o,a,s=r?t.ok:t.fail,l=t.resolve,c=t.reject,u=t.domain;try{s?(r||(2==e._h&&ei(e),e._h=1),!0===s?n=i:(u&&u.enter(),n=s(i),u&&(u.exit(),a=!0)),n===t.promise?c(Bn("Promise-chain cycle")):(o=Jn(n))?o.call(n,l,c):l(n)):c(i)}catch(e){u&&!a&&u.exit(),c(e)}};n.length>o;)a(n[o++]);e._c=[],e._n=!1,t&&!e._h&&Xn(e)})}},Xn=function(e){Dn.call(r,function(){var t,n,i,o=e._v,a=Zn(e);if(a&&(t=jn(function(){Kn?Hn.emit("unhandledRejection",o,e):(n=r.onunhandledrejection)?n({promise:e,reason:o}):(i=r.console)&&i.error&&i.error("Unhandled promise rejection",o)}),e._h=Kn||Zn(e)?2:1),e._a=void 0,a&&t.e)throw t.v})},Zn=function(e){return 1!==e._h&&0===(e._a||e._c).length},ei=function(e){Dn.call(r,function(){var t;Kn?Hn.emit("rejectionHandled",e):(t=r.onrejectionhandled)&&t({promise:e,reason:e._v})})},ti=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),Qn(t,!0))},ni=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw Bn("Promise can't be resolved itself");(t=Jn(e))?Vn(function(){var r={_w:n,_d:!1};try{t.call(e,i(ni,r,1),i(ti,r,1))}catch(e){ti.call(r,e)}}):(n._v=e,n._s=1,Qn(n,!1))}catch(e){ti.call({_w:n,_d:!1},e)}}};$n||(zn=function(e){Bt(this,zn,"Promise","_h"),n(e),Ln.call(this);try{e(i(ni,this,1),i(ti,this,1))}catch(e){ti.call(this,e)}},(Ln=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=Vt(zn.prototype,{then:function(e,t){var i,r,o,a=Gn((i=zn,void 0===(o=s(this).constructor)||null==(r=s(o)[hn])?i:n(r)));return a.ok="function"!=typeof e||e,a.fail="function"==typeof t&&t,a.domain=Kn?Hn.domain:void 0,this._c.push(a),this._a&&this._a.push(a),this._s&&Qn(this,!1),a.promise},catch:function(e){return this.then(void 0,e)}}),Nn=function(){var e=new Ln;this.promise=e,this.resolve=i(ni,e,1),this.reject=i(ti,e,1)},On.f=Gn=function(e){return e===zn||e===xn?new Nn(e):Mn(e)}),S(S.G+S.W+S.F*!$n,{Promise:zn}),ft(zn,"Promise"),qn("Promise"),xn=o.Promise,S(S.S+S.F*!$n,"Promise",{reject:function(e){var t=Gn(this);return(0,t.reject)(e),t.promise}}),S(S.S+S.F*!$n,"Promise",{resolve:function(e){return function(e,t){if(s(e),a(t)&&t.constructor===e)return t;var n=On.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),S(S.S+S.F*!($n&&Q(function(e){zn.all(e).catch(Yn)})),"Promise",{all:function(e){var t=this,n=Gn(t),i=n.resolve,r=n.reject,o=jn(function(){var n=[],o=0,a=1;Ht(e,!1,function(e){var s=o++,l=!1;n.push(void 0),a++,t.resolve(e).then(function(e){l||(l=!0,n[s]=e,--a||i(n))},r)}),--a||i(n)});return o.e&&r(o.v),n.promise},race:function(e){var t=this,n=Gn(t),i=n.reject,r=jn(function(){Ht(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var ii="".startsWith;S(S.P+S.F*rt("startsWith"),"String",{startsWith:function(e){var t=nt(this,e,"startsWith"),n=V(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return ii?ii.call(t,i,n):t.slice(n,n+i.length)===i}}),S(S.S,"Number",{isNaN:function(e){return e!=e}});var ri=function(e){return null!=e?e.constructor:null},oi=function(e,t){return Boolean(e&&t&&e instanceof t)},ai=function(e){return null==e},si=function(e){return ri(e)===Object},li=function(e){return ri(e)===String},ci=function(e){return Array.isArray(e)},ui=function(e){return oi(e,NodeList)},di=function(e){return ai(e)||(li(e)||ci(e)||ui(e))&&!e.length||si(e)&&!Object.keys(e).length},hi={nullOrUndefined:ai,object:si,number:function(e){return ri(e)===Number&&!Number.isNaN(e)},string:li,boolean:function(e){return ri(e)===Boolean},function:function(e){return ri(e)===Function},array:ci,weakMap:function(e){return oi(e,WeakMap)},nodeList:ui,element:function(e){return oi(e,Element)},textNode:function(e){return ri(e)===Text},event:function(e){return oi(e,Event)},keyboardEvent:function(e){return oi(e,KeyboardEvent)},cue:function(e){return oi(e,window.TextTrackCue)||oi(e,window.VTTCue)},track:function(e){return oi(e,TextTrack)||!ai(e)&&li(e.kind)},url:function(e){if(oi(e,window.URL))return!0;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!di(new URL(t).hostname)}catch(e){return!1}},empty:di},fi=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function pi(e,t,n){var i=this,r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!hi.empty(t)&&hi.function(n)){var s=t.split(" "),l=a;fi&&(l={passive:o,capture:a}),s.forEach(function(t){i&&i.eventListeners&&r&&i.eventListeners.push({element:e,type:t,callback:n,options:l}),e[r?"addEventListener":"removeEventListener"](t,n,l)})}}function mi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];pi.call(this,e,t,n,!0,i,r)}function gi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];pi.call(this,e,t,n,!1,i,r)}function yi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];pi.call(this,e,t,function o(){gi(e,t,o,i,r);for(var a=arguments.length,s=new Array(a),l=0;l<a;l++)s[l]=arguments[l];n.apply(this,s)},!0,i,r)}function vi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(hi.element(e)&&!hi.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}}function bi(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,r=e.parentNode,o=e.nextSibling;i.appendChild(e),o?r.insertBefore(i,o):r.appendChild(i)})}function ki(e,t){hi.element(e)&&!hi.empty(t)&&Object.entries(t).filter(function(e){var t=nn(e,2)[1];return!hi.nullOrUndefined(t)}).forEach(function(t){var n=nn(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)})}function wi(e,t,n){var i=document.createElement(e);return hi.object(t)&&ki(i,t),hi.string(n)&&(i.innerText=n),i}function Ti(e,t,n,i){hi.element(t)&&t.appendChild(wi(e,n,i))}function Ei(e){hi.nodeList(e)||hi.array(e)?Array.from(e).forEach(Ei):hi.element(e)&&hi.element(e.parentNode)&&e.parentNode.removeChild(e)}function Ai(e){if(hi.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function _i(e,t){return hi.element(t)&&hi.element(t.parentNode)&&hi.element(e)?(t.parentNode.replaceChild(e,t),e):null}function Si(e,t){if(!hi.string(e)||hi.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),r=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=o[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":hi.object(i)&&hi.string(i.class)&&(i.class+=" ".concat(r)),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}}),n}function Pi(e,t){if(hi.element(e)){var n=t;hi.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function Ci(e,t,n){if(hi.nodeList(e))return Array.from(e).map(function(e){return Ci(e,t,n)});if(hi.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function Li(e,t){return hi.element(e)&&e.classList.contains(t)}function Mi(e,t){var n={Element:Element};return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function Ni(e){return this.elements.container.querySelectorAll(e)}function xi(e){return this.elements.container.querySelector(e)}function Oi(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];hi.element(e)&&(e.focus(),t&&Ci(e,this.config.classNames.tabFocus))}var ji,Ii,Ri,Fi=(ji=document.createElement("span"),Ii={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},Ri=Object.keys(Ii).find(function(e){return void 0!==ji.style[e]}),!!hi.string(Ri)&&Ii[Ri]);function qi(e){setTimeout(function(){try{Pi(e,!0),e.offsetHeight,Pi(e,!1)}catch(e){}},0)}var Di,Vi={isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)},Bi={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},Hi={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=Vi.isIPhone&&n&&Hi.playsinline,r=Hi[e]||"html5"!==t;return{api:r,ui:r&&Hi.rangeInput&&("video"!==e||!Vi.isIPhone||i)}},pip:!Vi.isIPhone&&hi.function(wi("video").webkitSetPresentationMode),airplay:hi.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t,n=nn(e.split("/"),1)[0];if(!this.isHTML5||n!==this.type)return!1;e&&e.includes("codecs=")?t=e:"audio/mpeg"===e?t="audio/mpeg;":e in Bi&&(t="".concat(e,'; codecs="').concat(Bi[e],'"'));try{return Boolean(t&&this.media.canPlayType(t).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(Di=document.createElement("input"),Di.type="range","range"===Di.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==Fi,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},Ui={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return Hi.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return Ui.getSources.call(this).map(function(e){return Number(e.getAttribute("size"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=Ui.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("size"))},set:function(t){var n=Ui.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(n){var i=e.media,r=i.currentTime,o=i.paused,a=i.preload,s=i.readyState;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",function(){e.currentTime=r,o||e.play()}),e.media.load()),vi.call(e,e.media,"qualitychange",!1,{quality:t}),e.storage.set({quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(Ei(Ui.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Wi(e){return hi.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function zi(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function Ki(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];if(!n.length)return e;var r=n.shift();return hi.object(r)?(Object.keys(r).forEach(function(t){hi.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,tn({},t,{})),Ki(e[t],r[t])):Object.assign(e,tn({},t,r[t]))}),Ki.apply(void 0,[e].concat(n))):e}var Yi=g.f,Gi=_e.f,$i=r.RegExp,Ji=$i,Qi=$i.prototype,Xi=/a/g,Zi=/a/g,er=new $i(Xi)!==Xi;if(c&&(!er||l(function(){return Zi[x("match")]=!1,$i(Xi)!=Xi||$i(Zi)==Zi||"/a/i"!=$i(Xi,"i")}))){$i=function(e,t){var n=this instanceof $i,i=tt(e),r=void 0===t;return!n&&i&&e.constructor===$i&&r?e:pe(er?new Ji(i&&!r?e.source:e,t):Ji((i=e instanceof $i)?e.source:e,i&&r?st.call(e):t),n?this:Qi,$i)};for(var tr=function(e){e in $i||Yi($i,e,{configurable:!0,get:function(){return Ji[e]},set:function(t){Ji[e]=t}})},nr=Gi(Ji),ir=0;nr.length>ir;)tr(nr[ir++]);Qi.constructor=$i,$i.prototype=Qi,A(r,"RegExp",$i)}function rr(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return hi.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function or(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1"),"g"),n.toString())}function ar(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function sr(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=or(e,"-"," "),e=or(e,"_"," "),or(e=ar(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function lr(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}qn("RegExp");var cr=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(hi.empty(e)||hi.empty(t))return"";var n=zi(t.i18n,e);if(hi.empty(n))return"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=nn(e,2),i=t[0],r=t[1];n=or(n,i,r)}),n},ur=function(){function e(t){Xt(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return en(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(hi.empty(n))return null;var i=JSON.parse(n);return hi.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&hi.object(t)){var n=this.get();hi.empty(n)&&(n={}),Ki(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function dr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var r=new XMLHttpRequest;if(!("withCredentials"in r))return;r.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(r.responseText))}catch(e){n(r.responseText)}else n(r.response)}),r.addEventListener("error",function(){throw new Error(r.status)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})}function hr(e,t){if(hi.string(e)){var n=hi.string(t),i=function(){return null!==document.getElementById(t)},r=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var o=ur.supported,a=document.createElement("div");if(a.setAttribute("hidden",""),n&&a.setAttribute("id",t),o){var s=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==s){var l=JSON.parse(s);r(a,l.content)}}dr(e).then(function(e){hi.empty(e)||(o&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),r(a,e))}).catch(function(){})}}}var fr=function(e){return parseInt(e/60/60%60,10)},pr=function(e){return parseInt(e/60%60,10)},mr=function(e){return parseInt(e%60,10)};function gr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!hi.number(e))return gr(null,t,n);var i=function(e){return"0".concat(e).slice(-2)},r=fr(e),o=pr(e),a=mr(e);return r=t||r>0?"".concat(r,":"):"","".concat(n&&e>0?"-":"").concat(r).concat(i(o),":").concat(i(a))}var yr={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||Vi.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=xi.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:Ni.call(this,this.config.selectors.buttons.play),pause:xi.call(this,this.config.selectors.buttons.pause),restart:xi.call(this,this.config.selectors.buttons.restart),rewind:xi.call(this,this.config.selectors.buttons.rewind),fastForward:xi.call(this,this.config.selectors.buttons.fastForward),mute:xi.call(this,this.config.selectors.buttons.mute),pip:xi.call(this,this.config.selectors.buttons.pip),airplay:xi.call(this,this.config.selectors.buttons.airplay),settings:xi.call(this,this.config.selectors.buttons.settings),captions:xi.call(this,this.config.selectors.buttons.captions),fullscreen:xi.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=xi.call(this,this.config.selectors.progress),this.elements.inputs={seek:xi.call(this,this.config.selectors.inputs.seek),volume:xi.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:xi.call(this,this.config.selectors.display.buffer),currentTime:xi.call(this,this.config.selectors.display.currentTime),duration:xi.call(this,this.config.selectors.display.duration)},hi.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip))),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=yr.getIconUrl.call(this),i="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),r=document.createElementNS("http://www.w3.org/2000/svg","svg");ki(r,Ki(t,{role:"presentation",focusable:"false"}));var o=document.createElementNS("http://www.w3.org/2000/svg","use"),a="".concat(i,"-").concat(e);return"href"in o?o.setAttributeNS("http://www.w3.org/1999/xlink","href",a):o.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",a),r.appendChild(o),r},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={pip:"PIP",airplay:"AirPlay"}[e]||cr(e,this.config);return wi("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(hi.empty(e))return null;var t=wi("span",{class:this.config.classNames.menu.value});return t.appendChild(wi("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n,i,r,o,a=wi("button"),s=Object.assign({},t),l=sr(e),c=!1;switch("type"in s||(s.type="button"),"class"in s?s.class.includes(this.config.classNames.control)||(s.class+=" ".concat(this.config.classNames.control)):s.class=this.config.classNames.control,e){case"play":c=!0,n="play",r="pause",i="play",o="pause";break;case"mute":c=!0,n="mute",r="unmute",i="volume",o="muted";break;case"captions":c=!0,n="enableCaptions",r="disableCaptions",i="captions-off",o="captions-on";break;case"fullscreen":c=!0,n="enterFullscreen",r="exitFullscreen",i="enter-fullscreen",o="exit-fullscreen";break;case"play-large":s.class+=" ".concat(this.config.classNames.control,"--overlaid"),l="play",n="play",i="play";break;default:n=l,i=e}return c?(a.appendChild(yr.createIcon.call(this,o,{class:"icon--pressed"})),a.appendChild(yr.createIcon.call(this,i,{class:"icon--not-pressed"})),a.appendChild(yr.createLabel.call(this,r,{class:"label--pressed"})),a.appendChild(yr.createLabel.call(this,n,{class:"label--not-pressed"}))):(a.appendChild(yr.createIcon.call(this,i)),a.appendChild(yr.createLabel.call(this,n))),Ki(s,Si(this.config.selectors.buttons[l],s)),ki(a,s),"play"===l?(hi.array(this.elements.buttons[l])||(this.elements.buttons[l]=[]),this.elements.buttons[l].push(a)):this.elements.buttons[l]=a,a},createRange:function(e,t){var n=wi("input",Ki(Si(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":cr(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,yr.updateRangeFill.call(this,n),n},createProgress:function(e,t){var n=wi("progress",Ki(Si(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(wi("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?cr(i,this.config):"";n.innerText="% ".concat(r.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e){var t=Si(this.config.selectors.display[e]),n=wi("div",Ki(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":cr(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;mi(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var r,o=Mi(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(i.which))yr.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||o&&39===i.which?(r=e.nextElementSibling,hi.element(r)||(r=e.parentNode.firstElementChild)):(r=e.previousElementSibling,hi.element(r)||(r=e.parentNode.lastElementChild)),Oi.call(n,r,!0))}},!1),mi(e,"keyup",function(e){13===e.which&&yr.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,r=e.type,o=e.title,a=e.badge,s=void 0===a?null:a,l=e.checked,c=void 0!==l&&l,u=Si(this.config.selectors.inputs[r]),d=wi("button",Ki(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=wi("span");h.innerHTML=o,hi.element(s)&&h.appendChild(s),d.appendChild(h),Object.defineProperty(d,"checked",{enumerable:!0,get:function(){return"true"===d.getAttribute("aria-checked")},set:function(e){e&&Array.from(d.parentNode.children).filter(function(e){return Mi(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),d.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(d,"click keyup",function(e){if(!hi.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,r){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}yr.showMenuPanel.call(t,"home",hi.keyboardEvent(e))}},r,!1),yr.bindMenuItemShortcuts.call(this,d,r),i.appendChild(d)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return hi.number(e)?gr(e,fr(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];hi.element(e)&&hi.number(t)&&(e.innerText=yr.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(hi.element(this.elements.inputs.volume)&&yr.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),hi.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;hi.element(e)&&(e.value=t,yr.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&hi.event(e)){var n,i,r=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,r=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&yr.setRange.call(this,this.elements.inputs.seek,r);break;case"playing":case"progress":!function(e,n){var i=hi.number(n)?n:0,r=hi.element(e)?e:t.elements.display.buffer;if(hi.element(r)){r.value=i;var o=r.getElementsByTagName("span")[0];hi.element(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=hi.event(e)?e.target:e;if(hi.element(t)&&"range"===t.getAttribute("type")){if(Mi(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=yr.formatTime(this.currentTime),i=yr.formatTime(this.duration),r=cr("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(Mi(t,this.config.selectors.inputs.volume)){var o=100*t.value;t.setAttribute("aria-valuenow",o),t.setAttribute("aria-valuetext","".concat(o.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);Vi.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&hi.element(this.elements.inputs.seek)&&hi.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r="".concat(this.config.classNames.tooltip,"--visible"),o=function(e){Ci(t.elements.display.seekTooltip,r,e)};if(this.touch)o(!1);else{if(hi.event(e))n=100/i.width*(e.pageX-i.left);else{if(!Li(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),yr.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left="".concat(n,"%"),hi.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&o("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!hi.element(this.elements.display.duration)&&this.config.invertTime;yr.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||yr.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return Pi(this.elements.display.currentTime,!0),void Pi(this.elements.progress,!0);hi.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=hi.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&yr.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&yr.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),yr.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){Pi(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],r=null,o=t;if("captions"===e)r=this.currentTrack;else{if(r=hi.empty(n)?this[e]:n,hi.empty(r)&&(r=this.config[e].default),!hi.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '".concat(r,"' for ").concat(e));if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '".concat(r,"' for ").concat(e))}if(hi.element(o)||(o=i&&i.querySelector('[role="menu"]')),hi.element(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=yr.getLabel.call(this,e,r);var a=o&&o.querySelector('[value="'.concat(r,'"]'));hi.element(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?cr("normal",this.config):"".concat(t,"&times;");case"quality":if(hi.number(t)){var n=cr("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return ar(t);case"captions":return kr.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(hi.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');hi.array(e)&&(this.options.quality=Wi(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!hi.empty(this.options.quality)&&this.options.quality.length>1;if(yr.toggleMenuButton.call(this,"quality",i),Ai(n),yr.checkMenu.call(this),i){this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){yr.createMenuItem.call(t,{value:e,list:n,type:"quality",title:yr.getLabel.call(t,"quality",e),badge:function(e){var n=cr("qualityBadge.".concat(e),t.config);return n.length?yr.createBadge.call(t,n):null}(e)})}),yr.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(hi.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=kr.getTracks.call(this),i=Boolean(n.length);if(yr.toggleMenuButton.call(this,"captions",i),Ai(t),yr.checkMenu.call(this),i){var r=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:kr.getLabel.call(e,n),badge:n.language&&yr.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});r.unshift({value:-1,checked:!this.captions.toggled,title:cr("disabled",this.config),list:t,type:"language"}),r.forEach(yr.createMenuItem.bind(this)),yr.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(hi.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');hi.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var i=!hi.empty(this.options.speed)&&this.options.speed.length>1;yr.toggleMenuButton.call(this,"speed",i),Ai(n),yr.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){yr.createMenuItem.call(t,{value:e,list:n,type:"speed",title:yr.getLabel.call(t,"speed",e)})}),yr.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!hi.empty(e)&&Object.values(e).some(function(e){return!e.hidden});Pi(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;hi.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');Oi.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(hi.element(t)&&hi.element(n)){var i=t.hidden,r=i;if(hi.boolean(e))r=e;else if(hi.keyboardEvent(e)&&27===e.which)r=!1;else if(hi.event(e)){var o=t.contains(e.target);if(o||!o&&e.target!==n&&r)return}n.setAttribute("aria-expanded",r),Pi(t,!r),Ci(this.elements.container,this.config.classNames.menu.open,r),r&&hi.keyboardEvent(e)?yr.focusFirstMenuItem.call(this,null,!0):r||i||Oi.call(this,n,hi.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return Ei(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(hi.element(i)){var r=i.parentNode,o=Array.from(r.children).find(function(e){return!e.hidden});if(Hi.transitions&&!Hi.reducedMotion){r.style.width="".concat(o.scrollWidth,"px"),r.style.height="".concat(o.scrollHeight,"px");var a=yr.getMenuSize.call(this,i);mi.call(this,r,Fi,function t(n){n.target===r&&["width","height"].includes(n.propertyName)&&(r.style.width="",r.style.height="",gi.call(e,r,Fi,t))}),r.style.width="".concat(a.width,"px"),r.style.height="".concat(a.height,"px")}Pi(o,!0),Pi(i,!1),yr.focusFirstMenuItem.call(this,i,n)}},create:function(e){var t=this,n=wi("div",Si(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(yr.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(yr.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(yr.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(yr.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=wi("div",Si(this.config.selectors.progress));if(i.appendChild(yr.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),i.appendChild(yr.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=wi("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(yr.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(yr.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var o=wi("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&o.appendChild(yr.createButton.call(this,"mute")),this.config.controls.includes("volume")){var a={max:1,step:.05,value:this.config.volume};o.appendChild(yr.createRange.call(this,"volume",Ki(a,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=o}n.appendChild(o)}if(this.config.controls.includes("captions")&&n.appendChild(yr.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!hi.empty(this.config.settings)){var s=wi("div",{class:"plyr__menu",hidden:""});s.appendChild(yr.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=wi("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=wi("div"),u=wi("div",{id:"plyr-settings-".concat(e.id,"-home")}),d=wi("div",{role:"menu"});u.appendChild(d),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=wi("button",Ki(Si(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));yr.bindMenuItemShortcuts.call(t,i,n),mi(i,"click",function(){yr.showMenuPanel.call(t,n,!1)});var r=wi("span",null,cr(n,t.config)),o=wi("span",{class:t.config.classNames.menu.value});o.innerHTML=e[n],r.appendChild(o),i.appendChild(r),d.appendChild(i);var a=wi("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),s=wi("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});s.appendChild(wi("span",{"aria-hidden":!0},cr(n,t.config))),s.appendChild(wi("span",{class:t.config.classNames.hidden},cr("menuBack",t.config))),mi(a,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),yr.showMenuPanel.call(t,"home",!0))},!1),mi(s,"click",function(){yr.showMenuPanel.call(t,"home",!1)}),a.appendChild(s),a.appendChild(wi("div",{role:"menu"})),c.appendChild(a),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=a}),l.appendChild(c),s.appendChild(l),n.appendChild(s),this.elements.settings.popup=l,this.elements.settings.menu=s}return this.config.controls.includes("pip")&&Hi.pip&&n.appendChild(yr.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&Hi.airplay&&n.appendChild(yr.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(yr.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(yr.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&yr.setQualityMenu.call(this,Ui.getQualityOptions.call(this)),yr.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=yr.getIconUrl.call(this);t.cors&&hr(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},r=!0;hi.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this.props)),this.config.controls||(this.config.controls=[]),hi.element(this.config.controls)||hi.string(this.config.controls)?n=this.config.controls:(n=yr.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:kr.getLabel.call(this)}),r=!1);var o,a=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=nn(e,2),i=n[0],r=n[1];t=or(t,"{".concat(i,"}"),r)}),t};if(r&&(hi.string(this.config.controls)?n=a(n):hi.element(n)&&(n.innerHTML=a(n.innerHTML))),hi.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),hi.element(o)||(o=this.elements.container),o[hi.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),hi.element(this.elements.controls)||yr.findElements.call(this),!hi.empty(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return Li(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Ci(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){hi.array(e)||hi.nodeList(e)?Array.from(e).filter(Boolean).forEach(s):s(e)})}if(window.navigator.userAgent.includes("Edge")&&qi(o),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,d="".concat(u.controls.wrapper," ").concat(u.labels," .").concat(c.hidden),h=Ni.call(this,d);Array.from(h).forEach(function(t){Ci(t,e.config.classNames.hidden,!1),Ci(t,e.config.classNames.tooltip,!0)})}}};function vr(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var n=document.createElement("a");n.href=t,t=n.href}try{return new URL(t)}catch(e){return null}}function br(e){var t=new URLSearchParams;return hi.object(e)&&Object.entries(e).forEach(function(e){var n=nn(e,2),i=n[0],r=n[1];t.set(i,r)}),t}var kr={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!Hi.textTracks)hi.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&yr.setCaptionsMenu.call(this);else{var e,t;if(hi.element(this.elements.captions)||(this.elements.captions=wi("div",Si(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,hi.element(e)&&hi.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),Vi.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=vr(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&dr(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){Ei(e)})})}var i=Wi((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),r=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===r)r=nn(i,1)[0];var o=this.storage.get("captions");if(hi.boolean(o)||(o=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:o,language:r,languages:i}),this.isHTML5){var a=this.config.captions.update?"addtrack removetrack":"removetrack";mi.call(this,this.media.textTracks,a,kr.update.bind(this))}setTimeout(kr.update.bind(this),0)}},update:function(){var e=this,t=kr.getTracks.call(this,!0),n=this.captions,i=n.active,r=n.language,o=n.meta,a=n.currentTrackNode,s=Boolean(t.find(function(e){return e.language===r}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!o.get(e)}).forEach(function(t){e.debug.log("Track added",t),o.set(t,{default:"showing"===t.mode}),t.mode="hidden",mi.call(e,t,"cuechange",function(){return kr.updateCues.call(e)})}),(s&&this.language!==r||!t.includes(a))&&(kr.setLanguage.call(this,r),kr.toggle.call(this,i&&s)),Ci(this.elements.container,this.config.classNames.captions.enabled,!hi.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&yr.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,r=hi.nullOrUndefined(e)?!n:e;if(r!==n){if(t||(this.captions.active=r,this.storage.set({captions:r})),!this.language&&r&&!t){var o=kr.getTracks.call(this),a=kr.findTrack.call(this,[this.captions.language].concat(rn(this.captions.languages)),!0);return this.captions.language=a.language,void kr.set.call(this,o.indexOf(a))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=r),Ci(this.elements.container,i,r),this.captions.toggled=r,yr.updateSetting.call(this,"captions"),vi.call(this,this.media,r?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=kr.getTracks.call(this);if(-1!==e)if(hi.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=(i||{}).language;this.captions.currentTrackNode=i,yr.updateSetting.call(this,"captions"),t||(this.captions.language=r,this.storage.set({language:r})),this.isVimeo&&this.embed.enableTextTrack(r),vi.call(this,this.media,"languagechange")}kr.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&kr.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else kr.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(hi.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=kr.getTracks.call(this),r=kr.findTrack.call(this,[n]);kr.set.call(this,i.indexOf(r),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t,n=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=kr.getTracks.call(this),o=function(e){return Number((n.captions.meta.get(e)||{}).default)},a=Array.from(r).sort(function(e,t){return o(t)-o(e)});return e.every(function(e){return!(t=a.find(function(t){return t.language===e}))}),t||(i?a[0]:void 0)},getCurrentTrack:function(){return kr.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!hi.track(t)&&Hi.textTracks&&this.captions.toggled&&(t=kr.getCurrentTrack.call(this)),hi.track(t)?hi.empty(t.label)?hi.empty(t.language)?cr("enabled",this.config):e.language.toUpperCase():t.label:cr("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(hi.element(this.elements.captions))if(hi.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=kr.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(lr)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){Ai(this.elements.captions);var r=wi("span",Si(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),vi.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},wr={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},Tr={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Er={audio:"audio",video:"video"};var Ar=function(){},_r=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Xt(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return en(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):Ar}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):Ar}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):Ar}}]),e}();function Sr(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;hi.element(e)&&(e.pressed=this.active),vi.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),Vi.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(hi.element(e)){var n=Ni.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1];pi.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function Pr(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",Ci(this.target,this.player.config.classNames.fullscreen.fallback,t),Vi.isIos){var n=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";n||(n=document.createElement("meta")).setAttribute("name","viewport");var r=hi.string(n.content)&&n.content.includes(i);t?(this.cleanupViewport=!r,r||(n.content+=",".concat(i))):this.cleanupViewport&&(n.content=n.content.split(",").filter(function(e){return e.trim()!==i}).join(",")),setTimeout(function(){return qi(e.target)},100)}Sr.call(this)}var Cr=function(){function e(t){var n=this;Xt(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},mi.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){Sr.call(n)}),mi.call(this.player,this.player.elements.container,"dblclick",function(e){hi.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return en(e,[{key:"update",value:function(){this.enabled?this.player.debug.log("".concat(e.native?"Native":"Fallback"," fullscreen enabled")):this.player.debug.log("Fullscreen not supported and fallback disabled"),Ci(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(Vi.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():e.native?this.prefix?hi.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen():Pr.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(Vi.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!hi.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(t).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else Pr.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target:Li(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return Vi.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(hi.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!hi.function(document["".concat(t,"ExitFullscreen")])&&!hi.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),Lr=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function Mr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var r=new Image,o=function(){delete r.onload,delete r.onerror,(r.naturalWidth>=t?n:i)(r)};Object.assign(r,{onload:o,onerror:o,src:e})})}S(S.S,"Math",{sign:Lr});var Nr={addStyleHook:function(){Ci(this.elements.container,this.config.selectors.container.replace(".",""),!0),Ci(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for ".concat(this.provider," ").concat(this.type)),void Nr.toggleNativeControls.call(this,!0);hi.element(this.elements.controls)||(yr.inject.call(this),this.listeners.controls()),Nr.toggleNativeControls.call(this),this.isHTML5&&kr.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,yr.updateVolume.call(this),yr.timeUpdate.call(this),Nr.checkPlaying.call(this),Ci(this.elements.container,this.config.classNames.pip.supported,Hi.pip&&this.isHTML5&&this.isVideo),Ci(this.elements.container,this.config.classNames.airplay.supported,Hi.airplay&&this.isHTML5),Ci(this.elements.container,this.config.classNames.isIos,Vi.isIos),Ci(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){vi.call(e,e.media,"ready")},0),Nr.setTitle.call(this),this.poster&&Nr.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&yr.durationUpdate.call(this)},setTitle:function(){var e=cr("play",this.config);if(hi.string(this.config.title)&&!hi.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=xi.call(this,"iframe");if(!hi.element(t))return;var n=hi.empty(this.config.title)?"video":this.config.title,i=cr("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){Ci(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):mi.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return Mr(e)}).catch(function(n){throw e===t.poster&&Nr.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),Nr.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;Ci(this.elements.container,this.config.classNames.playing,this.playing),Ci(this.elements.container,this.config.classNames.paused,this.paused),Ci(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),hi.event(e)&&"timeupdate"===e.type||Nr.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){Ci(t.elements.container,t.config.classNames.loading,t.loading),Nr.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},xr=function(){function e(t){Xt(this,e),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return en(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,r="keydown"===e.type,o=r&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&hi.number(i)){if(r){var a=document.activeElement;if(hi.element(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&Mi(a,s))return;if(32===e.which&&Mi(a,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:o||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:o||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:o||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:o||t.toggleCaptions();break;case 76:t.loop=!t.loop}!t.fullscreen.enabled&&t.fullscreen.active&&27===i&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){yr.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,Ci(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,r=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||r)i=t.config.classNames.tabFocus,Ci(Ni.call(t,".".concat(i)),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&Ci(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&pi.call(t,window,"keydown keyup",this.handleKey,e,!1),pi.call(t,document.body,"click",this.toggleMenu,e),yi.call(t,document.body,"touchstart",this.firstTouch),pi.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.elements;!e.config.keyboard.global&&e.config.keyboard.focused&&mi.call(e,t.container,"keydown keyup",this.handleKey,!1),mi.call(e,t.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(n){var i=t.controls;i&&"enterfullscreen"===n.type&&(i.pressed=!1,i.hover=!1);var r=0;["touchstart","touchmove","mousemove"].includes(n.type)&&(Nr.toggleControls.call(e,!0),r=e.touch?3e3:2e3),clearTimeout(e.timers.controls),e.timers.controls=setTimeout(function(){return Nr.toggleControls.call(e,!1)},r)})}},{key:"media",value:function(){var e=this.player,t=e.elements;if(mi.call(e,e.media,"timeupdate seeking seeked",function(t){return yr.timeUpdate.call(e,t)}),mi.call(e,e.media,"durationchange loadeddata loadedmetadata",function(t){return yr.durationUpdate.call(e,t)}),mi.call(e,e.media,"canplay",function(){Pi(t.volume,!e.hasAudio),Pi(t.buttons.mute,!e.hasAudio)}),mi.call(e,e.media,"ended",function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&e.restart()}),mi.call(e,e.media,"progress playing seeking seeked",function(t){return yr.updateProgress.call(e,t)}),mi.call(e,e.media,"volumechange",function(t){return yr.updateVolume.call(e,t)}),mi.call(e,e.media,"playing play pause ended emptied timeupdate",function(t){return Nr.checkPlaying.call(e,t)}),mi.call(e,e.media,"waiting canplay seeked playing",function(t){return Nr.checkLoading.call(e,t)}),mi.call(e,e.media,"playing",function(){e.ads&&e.ads.enabled&&!e.ads.initialized&&e.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.play()})}),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var n=xi.call(e,".".concat(e.config.classNames.video));if(!hi.element(n))return;mi.call(e,t.container,"click",function(i){([t.container,n].includes(i.target)||n.contains(i.target))&&(e.touch&&e.config.hideControls||(e.ended?(e.restart(),e.play()):e.togglePlay()))})}e.supported.ui&&e.config.disableContextMenu&&mi.call(e,t.wrapper,"contextmenu",function(e){e.preventDefault()},!1),mi.call(e,e.media,"volumechange",function(){e.storage.set({volume:e.volume,muted:e.muted})}),mi.call(e,e.media,"ratechange",function(){yr.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),mi.call(e,e.media,"qualitychange",function(t){yr.updateSetting.call(e,"quality",null,t.detail.quality)});var i=e.config.events.concat(["keyup","keydown"]).join(" ");mi.call(e,e.media,i,function(n){var i=n.detail,r=void 0===i?{}:i;"error"===n.type&&(r=e.media.error),vi.call(e,t.container,n.type,!0,r)})}},{key:"proxy",value:function(e,t,n){var i=this.player,r=i.config.listeners[n],o=!0;hi.function(r)&&(o=r.call(i,e)),o&&hi.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var r=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=this.player,s=a.config.listeners[i],l=hi.function(s);mi.call(a,e,t,function(e){return r.proxy(e,n,i)},o&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=Vi.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),yr.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),yr.toggleMenu.call(t,e)):yr.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&yr.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!hi.keyboardEvent(e)||39===i||37===i){var r=n.hasAttribute("play-on-seeked"),o=["mouseup","touchend","keyup"].includes(e.type);r&&o?(n.removeAttribute("play-on-seeked"),t.play()):!o&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),Vi.isIos){var r=Ni.call(t,'input[type="range"]');Array.from(r).forEach(function(t){return e.bind(t,i,function(e){return qi(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");hi.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return yr.updateSeekTooltip.call(t,e)}),Vi.isWebkit&&Array.from(Ni.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return yr.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!hi.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,yr.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin focusout",function(n){var i=t.config,r=t.elements,o=t.timers,a="focusin"===n.type;if(Ci(r.controls,i.classNames.noTransition,a),Nr.toggleControls.call(t,a),a){setTimeout(function(){Ci(r.controls,i.classNames.noTransition,!1)},0);var s=e.touch?3e3:4e3;clearTimeout(o.controls),o.controls=setTimeout(function(){return Nr.toggleControls.call(t,!1)},s)}}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=nn([e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),2),r=i[0],o=i[1],a=Math.sign(Math.abs(r)>Math.abs(o)?r:o);t.increaseVolume(a/50);var s=t.media.volume;(1===a&&s<1||-1===a&&s>0)&&e.preventDefault()},"volume",!1)}}]),e}(),Or=g.f,jr=Function.prototype,Ir=/^\s*function ([^ (]*)/;"name"in jr||c&&Or(jr,"name",{configurable:!0,get:function(){try{return(""+this).match(Ir)[1]}catch(e){return""}}}),at("match",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]});var Rr=t(function(e,t){var n;n=function(){var e=function(){},t={},n={},i={};function r(e,t){if(e){var r=i[e];if(n[e]=t,r)for(;r.length;)r[0](e,t),r.splice(0,1)}}function o(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function a(t,n,i,r){var o,s,l=document,c=i.async,u=(i.numRetries||0)+1,d=i.before||e,h=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(t)?(o=!0,(s=l.createElement("link")).rel="stylesheet",s.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(s=l.createElement("img")).src=h:((s=l.createElement("script")).src=t,s.async=void 0===c||c),s.onload=s.onerror=s.onbeforeload=function(e){var l=e.type[0];if(o&&"hideFocus"in s)try{s.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(r+=1)<u)return a(t,n,i,r);n(t,l,e.defaultPrevented)},!1!==d(t,s)&&l.head.appendChild(s)}function s(e,n,i){var s,l;if(n&&n.trim&&(s=n),l=(s?i:n)||{},s){if(s in t)throw"LoadJS";t[s]=!0}!function(e,t,n){var i,r,o=(e=e.push?e:[e]).length,s=o,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--o||t(l)},r=0;r<s;r++)a(e[r],i,n)}(e,function(e){o(l,e),r(s,e)},l)}return s.ready=function(e,t){return function(e,t){e=e.push?e:[e];var r,o,a,s=[],l=e.length,c=l;for(r=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)o=e[l],(a=n[o])?r(o,a):(i[o]=i[o]||[]).push(r)}(e,function(e){o(t,e)}),s},s.done=function(e){r(e,[])},s.reset=function(){t={},n={},i={}},s.isDefined=function(e){return e in t},s},e.exports=n()});function Fr(e){return new Promise(function(t,n){Rr(e,{success:t,error:n})})}function qr(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,vi.call(this,this.media,e?"play":"pause"))}var Dr={setup:function(){var e=this;Ci(this.elements.wrapper,this.config.classNames.embed,!0),Dr.setAspectRatio.call(this),hi.object(window.Vimeo)?Dr.ready.call(this):Fr(this.config.urls.vimeo.sdk).then(function(){Dr.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=nn((hi.string(e)?e:this.config.ratio).split(":"),2),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom="".concat(n,"%"),this.supported.ui){var i=(240-n)/4.8;this.media.style.transform="translateY(-".concat(i,"%)")}},ready:function(){var e=this,t=this,n=br({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),i=t.media.getAttribute("src");hi.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var r,o=(r=i,hi.empty(r)?null:hi.number(Number(r))?r:r.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:r),a=wi("iframe"),s=rr(t.config.urls.vimeo.iframe,o,n);a.setAttribute("src",s),a.setAttribute("allowfullscreen",""),a.setAttribute("allowtransparency",""),a.setAttribute("allow","autoplay");var l=wi("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(a),t.media=_i(l,t.media),dr(rr(t.config.urls.vimeo.api,o),"json").then(function(e){if(!hi.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname="".concat(n.pathname.split("_")[0],".jpg"),Nr.setPoster.call(t,n.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(a,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return qr.call(t,!0),t.embed.play()},t.media.pause=function(){return qr.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var n=t.embed,i=t.media,r=t.paused,o=t.volume,a=r&&!n.hasPlayed;i.seeking=!0,vi.call(t,i,"seeking"),Promise.resolve(a&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return a&&n.pause()}).then(function(){return a&&n.setVolume(o)}).catch(function(){})}});var u=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return u},set:function(e){t.embed.setPlaybackRate(e).then(function(){u=e,vi.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&yr.setSpeedMenu.call(t,[])})}});var d=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return d},set:function(e){t.embed.setVolume(e).then(function(){d=e,vi.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!hi.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,vi.call(t,t.media,"volumechange")})}});var f,p=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return p},set:function(e){var n=hi.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){p=n})}}),t.embed.getVideoUrl().then(function(e){f=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return f}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var n=function(e,t){var n=function e(t,n){return 0===n?t:e(n,t%n)}(e,t);return"".concat(e/n,":").concat(t/n)}(t[0],t[1]);Dr.setAspectRatio.call(e,n)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,Nr.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,vi.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,vi.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,kr.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return t=e.text,n=document.createDocumentFragment(),i=document.createElement("div"),n.appendChild(i),i.innerHTML=t,n.firstChild.innerText;var t,n,i});kr.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){qr.call(t,!e),e||vi.call(t,t.media,"playing")}),hi.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){qr.call(t,!0),vi.call(t,t.media,"playing")}),t.embed.on("pause",function(){qr.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,vi.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,vi.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&vi.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,vi.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,vi.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,vi.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,vi.call(t,t.media,"error")}),setTimeout(function(){return Nr.build.call(t)},0)}};function Vr(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,vi.call(this,this.media,e?"play":"pause"))}var Br,Hr={setup:function(){var e=this;Ci(this.elements.wrapper,this.config.classNames.embed,!0),Hr.setAspectRatio.call(this),hi.object(window.YT)&&hi.function(window.YT.Player)?Hr.ready.call(this):(Fr(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){Hr.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(hi.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(hi.empty(n))return this.config.title=n,void Nr.setTitle.call(this)}var i=this.config.keys.google;hi.string(i)&&!hi.empty(i)&&dr(rr(this.config.urls.youtube.api,e,i)).then(function(e){hi.object(e)&&(t.config.title=e.items[0].snippet.title,Nr.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom="".concat(100/e[0]*e[1],"%")},ready:function(){var e=this,t=e.media.getAttribute("id");if(hi.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");hi.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,r,o=(i=n,hi.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),a=(r=e.provider,"".concat(r,"-").concat(Math.floor(1e4*Math.random()))),s=wi("div",{id:a,poster:e.poster});e.media=_i(s,e.media);var l=function(e){return"https://img.youtube.com/vi/".concat(o,"/").concat(e,"default.jpg")};Mr(l("maxres"),121).catch(function(){return Mr(l("sd"),121)}).catch(function(){return Mr(l("hq"))}).then(function(t){return Nr.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(a,{videoId:o,playerVars:{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!e.media.error){var n=t.data,i={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},vi.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),vi.call(e,e.media,"ratechange")},onReady:function(t){if(!hi.function(e.media.play)){var n=t.target;Hr.getTitle.call(e,o),e.media.play=function(){Vr.call(e,!0),n.playVideo()},e.media.pause=function(){Vr.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,vi.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),vi.call(e,e.media,"volumechange")}});var r=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return r},set:function(t){var i=hi.boolean(t)?t:r;r=i,n[i?"mute":"unMute"](),vi.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),vi.call(e,e.media,"timeupdate"),vi.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&vi.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),vi.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return Nr.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,vi.call(e,e.media,"seeked")),t.data){case-1:vi.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),vi.call(e,e.media,"progress");break;case 0:Vr.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):vi.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Vr.call(e,!0),vi.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){vi.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),vi.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Vr.call(e,!1)}vi.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},Ur={setup:function(){this.media?(Ci(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),Ci(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&Ci(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=wi("div",{class:this.config.classNames.video}),bi(this.media,this.elements.wrapper),this.elements.poster=wi("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Ui.extend.call(this):this.isYouTube?Hr.setup.call(this):this.isVimeo&&Dr.setup.call(this)):this.debug.warn("No media element found!")}},Wr=function(){function e(t){var n=this;Xt(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){n.on("loaded",e),n.on("error",t)}),this.load()}return en(e,[{key:"load",value:function(){var e=this;this.enabled&&(hi.object(window.google)&&hi.object(window.google.ima)?this.ready():Fr(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=wi("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=gr(Math.max(e.manager.getRemainingTime(),0)),n="".concat(cr("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),hi.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(hi.element(n)){var i=100/t.player.duration*e,r=wi("span",{class:t.player.config.classNames.cues});r.style.left="".concat(i.toString(),"%"),n.appendChild(r)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),r=function(e){var n="ads".concat(e.replace(/_/g,"").toLowerCase());vi.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),r(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:r(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:r(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:r(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:r(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e,t=this,n=this.player.elements.container;this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("seeking",function(){return e=t.player.currentTime}),this.player.on("seeked",function(){var n=t.player.currentTime;hi.empty(t.cuePoints)||t.cuePoints.forEach(function(i,r){e<i&&i<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(n.offsetWidth,n.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=new Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var o=this.events[e];hi.array(o)&&o.forEach(function(e){hi.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return hi.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: ".concat(t)),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){hi.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.ads.enabled&&!hi.empty(this.publisherId)}},{key:"tagUrl",get:function(){var e={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(br(e))}}]),e}(),zr={insertElements:function(e,t){var n=this;hi.string(t)?Ti(e,this.media,{src:t}):hi.array(t)&&t.forEach(function(t){Ti(e,n.media,t)})},change:function(e){var t=this;zi(e,"sources.length")?(Ui.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],Ei(t.media),t.media=null,hi.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=nn(n,1)[0],o=r.provider,a=void 0===o?Tr.html5:o,s=r.src,l="html5"===a?i:"div",c="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:i,supported:Hi.check(i,a,t.config.playsinline),media:wi(l,c)}),t.elements.container.appendChild(t.media),hi.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),hi.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),Nr.addStyleHook.call(t),t.isHTML5&&zr.insertElements.call(t,"source",n),t.config.title=e.title,Ur.setup.call(t),t.isHTML5&&("tracks"in e&&zr.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&Nr.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Kr=function(){function e(t,n){var i=this;if(Xt(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=Hi.touch,this.media=t,hi.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||hi.nodeList(this.media)||hi.array(this.media))&&(this.media=this.media[0]),this.config=Ki({},wr,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new _r(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",Hi),!hi.nullOrUndefined(this.media)&&hi.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(Hi.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var o=this.media.tagName.toLowerCase(),a=null,s=null;switch(o){case"div":if(a=this.media.querySelector("iframe"),hi.element(a)){if(s=vr(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?Tr.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Tr.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",s.search.length){var l=["1","true"];l.includes(s.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(s.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=l.includes(s.searchParams.get("playsinline")),this.config.hl=s.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(hi.empty(this.provider)||!Object.keys(Tr).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=Er.video;break;case"video":case"audio":this.type=o,this.provider=Tr.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=Hi.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new xr(this),this.storage=new ur(this),this.media.plyr=this,hi.element(this.elements.container)||(this.elements.container=wi("div"),bi(this.media,this.elements.container)),Nr.addStyleHook.call(this),Ur.setup.call(this),this.config.debug&&mi.call(this,this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&Nr.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new Cr(this),this.config.ads.enabled&&(this.ads=new Wr(this)),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return en(e,[{key:"play",value:function(){return hi.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&hi.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(hi.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):hi.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(hi.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(hi.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(hi.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){kr.toggle.call(this,e,!1)}},{key:"airplay",value:function(){Hi.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=Li(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=Ci(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!hi.empty(this.config.settings)&&yr.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";vi.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){mi.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){yi.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){gi(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(Ei(t.elements.buttons.play),Ei(t.elements.captions),Ei(t.elements.controls),Ei(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),hi.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,r=e.options;t.removeEventListener(n,i,r)}),this.eventListeners=[])}.call(t),_i(t.elements.original,t.elements.container),vi.call(t,t.elements.original,"destroyed",!0),hi.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),Nr.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&hi.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return Hi.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===Tr.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===Tr.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===Tr.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===Er.video)}},{key:"isAudio",get:function(){return Boolean(this.type===Er.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=hi.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return hi.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration,n=hi.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;hi.string(t)&&(t=Number(t)),hi.number(t)||(t=this.storage.get("volume")),hi.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!hi.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;hi.boolean(t)||(t=this.storage.get("muted")),hi.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;hi.number(e)&&(t=e),hi.number(t)||(t=this.storage.get("speed")),hi.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed (".concat(t,")"))},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!hi.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(hi.number);if(!n.includes(i)){var r=function(e,t){return hi.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null}(n,i);this.debug.warn("Unsupported quality option: ".concat(i,", using ").concat(r," instead")),i=r}t.selected=i,this.media.quality=i}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=hi.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){zr.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?Nr.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=hi.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){kr.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){kr.setLanguage.call(this,e,!1)},get:function(){return(kr.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(Hi.pip){var i=hi.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return Hi.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return Hi.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return hr(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return hi.string(t)?i=Array.from(document.querySelectorAll(t)):hi.nodeList(t)?i=Array.from(t):hi.array(t)&&(i=t.filter(hi.element)),hi.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();return Kr.defaults=(Br=wr,JSON.parse(JSON.stringify(Br))),Kr});
//# sourceMappingURL=plyr.polyfilled.min.js.map
diff --git a/dist/plyr.polyfilled.min.js.map b/dist/plyr.polyfilled.min.js.map
index 23f3a1c2..3a39679e 100644
--- a/dist/plyr.polyfilled.min.js.map
+++ b/dist/plyr.polyfilled.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["node_modules/core-js/modules/_global.js","node_modules/core-js/modules/_core.js","node_modules/core-js/modules/_is-object.js","node_modules/core-js/modules/_an-object.js","node_modules/core-js/modules/_fails.js","node_modules/core-js/modules/_descriptors.js","node_modules/core-js/modules/_dom-create.js","node_modules/core-js/modules/_ie8-dom-define.js","node_modules/core-js/modules/_to-primitive.js","node_modules/core-js/modules/_object-dp.js","node_modules/core-js/modules/_property-desc.js","node_modules/core-js/modules/_hide.js","node_modules/core-js/modules/_has.js","node_modules/core-js/modules/_uid.js","node_modules/core-js/modules/_redefine.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","node_modules/core-js/modules/_export.js","node_modules/core-js/modules/_typed.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_to-index.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_iobject.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_shared-key.js","node_modules/core-js/modules/_object-keys-internal.js","node_modules/core-js/modules/_enum-bug-keys.js","node_modules/core-js/modules/_object-gopn.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_array-fill.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_typed-buffer.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/es6.typed.array-buffer.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_object-keys.js","node_modules/core-js/modules/_object-dps.js","node_modules/core-js/modules/_html.js","node_modules/core-js/modules/_object-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_is-array.js","node_modules/core-js/modules/_array-species-constructor.js","node_modules/core-js/modules/_array-species-create.js","node_modules/core-js/modules/_array-methods.js","node_modules/core-js/modules/_add-to-unscopables.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/_array-copy-within.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_typed-array.js","node_modules/core-js/modules/es6.typed.int8-array.js","node_modules/core-js/modules/es6.typed.uint8-array.js","node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","node_modules/core-js/modules/es6.typed.int16-array.js","node_modules/core-js/modules/es6.typed.uint16-array.js","node_modules/core-js/modules/es6.typed.int32-array.js","node_modules/core-js/modules/es6.typed.uint32-array.js","node_modules/core-js/modules/es6.typed.float32-array.js","node_modules/core-js/modules/es6.typed.float64-array.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-strong.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.map.js","node_modules/core-js/modules/es6.set.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/es6.weak-set.js","node_modules/core-js/modules/es6.reflect.apply.js","node_modules/core-js/modules/_invoke.js","node_modules/core-js/modules/_bind.js","node_modules/core-js/modules/es6.reflect.construct.js","node_modules/core-js/modules/es6.reflect.define-property.js","node_modules/core-js/modules/es6.reflect.delete-property.js","node_modules/core-js/modules/es6.reflect.get.js","node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","node_modules/core-js/modules/es6.reflect.get-prototype-of.js","node_modules/core-js/modules/es6.reflect.has.js","node_modules/core-js/modules/es6.reflect.is-extensible.js","node_modules/core-js/modules/_own-keys.js","node_modules/core-js/modules/es6.reflect.own-keys.js","node_modules/core-js/modules/es6.reflect.prevent-extensions.js","node_modules/core-js/modules/es6.reflect.set.js","node_modules/core-js/modules/es6.reflect.set-prototype-of.js","node_modules/core-js/modules/_task.js","node_modules/core-js/modules/_microtask.js","node_modules/core-js/modules/_new-promise-capability.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/_perform.js","node_modules/core-js/modules/_user-agent.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/_wks-ext.js","node_modules/core-js/modules/_wks-define.js","node_modules/core-js/modules/_object-gopn-ext.js","node_modules/core-js/modules/es6.symbol.js","node_modules/core-js/modules/_enum-keys.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.freeze.js","node_modules/core-js/modules/es6.object.seal.js","node_modules/core-js/modules/es6.object.prevent-extensions.js","node_modules/core-js/modules/es6.object.is-frozen.js","node_modules/core-js/modules/es6.object.is-sealed.js","node_modules/core-js/modules/es6.object.is-extensible.js","node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","node_modules/core-js/modules/es6.object.get-prototype-of.js","node_modules/core-js/modules/es6.object.keys.js","node_modules/core-js/modules/es6.object.get-own-property-names.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/_same-value.js","node_modules/core-js/modules/es6.object.is.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.string.raw.js","node_modules/core-js/modules/es6.string.from-code-point.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.code-point-at.js","node_modules/core-js/modules/_string-repeat.js","node_modules/core-js/modules/es6.string.repeat.js","node_modules/core-js/modules/_is-regexp.js","node_modules/core-js/modules/_string-context.js","node_modules/core-js/modules/_fails-is-regexp.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.string.ends-with.js","node_modules/core-js/modules/es6.string.includes.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/es6.array.of.js","node_modules/core-js/modules/es6.array.copy-within.js","node_modules/core-js/modules/es6.array.find.js","node_modules/core-js/modules/es6.array.find-index.js","node_modules/core-js/modules/es6.array.fill.js","node_modules/core-js/modules/es6.number.is-finite.js","node_modules/core-js/modules/_is-integer.js","node_modules/core-js/modules/es6.number.is-integer.js","node_modules/core-js/modules/es6.number.is-safe-integer.js","node_modules/core-js/modules/es6.number.is-nan.js","node_modules/core-js/modules/es6.number.epsilon.js","node_modules/core-js/modules/es6.number.min-safe-integer.js","node_modules/core-js/modules/es6.number.max-safe-integer.js","node_modules/core-js/modules/_math-log1p.js","node_modules/core-js/modules/es6.math.acosh.js","node_modules/core-js/modules/es6.math.asinh.js","node_modules/core-js/modules/es6.math.atanh.js","node_modules/core-js/modules/_math-sign.js","node_modules/core-js/modules/es6.math.cbrt.js","node_modules/core-js/modules/es6.math.clz32.js","node_modules/core-js/modules/es6.math.cosh.js","node_modules/core-js/modules/_math-expm1.js","node_modules/core-js/modules/es6.math.expm1.js","node_modules/core-js/modules/_math-fround.js","node_modules/core-js/modules/es6.math.fround.js","node_modules/core-js/modules/es6.math.hypot.js","node_modules/core-js/modules/es6.math.imul.js","node_modules/core-js/modules/es6.math.log1p.js","node_modules/core-js/modules/es6.math.log10.js","node_modules/core-js/modules/es6.math.log2.js","node_modules/core-js/modules/es6.math.sign.js","node_modules/core-js/modules/es6.math.sinh.js","node_modules/core-js/modules/es6.math.tanh.js","node_modules/core-js/modules/es6.math.trunc.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","node_modules/core-js/modules/_string-pad.js","node_modules/core-js/modules/es7.string.pad-start.js","node_modules/core-js/modules/es7.string.pad-end.js","node_modules/core-js/modules/web.timers.js","node_modules/core-js/modules/web.immediate.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/regenerator-runtime/runtime.js","node_modules/custom-event-polyfill/polyfill.js","node_modules/url-polyfill/url-polyfill.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["global","module","exports","window","Math","self","Function","__g","core","version","__e","_isObject","it","_anObject","isObject","TypeError","_fails","exec","e","_descriptors","require$$0","Object","defineProperty","get","a","document","is","createElement","_domCreate","_ie8DomDefine","require$$1","require$$2","_toPrimitive","S","fn","val","toString","call","valueOf","dP","O","P","Attributes","anObject","toPrimitive","IE8_DOM_DEFINE","value","_propertyDesc","bitmap","enumerable","configurable","writable","_hide","object","key","f","createDesc","hasOwnProperty","_has","id","px","random","_uid","concat","undefined","SRC","$toString","TPL","split","inspectSource","safe","isFunction","has","hide","join","String","prototype","this","_aFunction","_ctx","that","length","aFunction","b","c","apply","arguments","$export","type","name","source","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","ctx","redefine","U","W","R","Typed","_export","TYPED","uid","VIEW","ABV","ArrayBuffer","DataView","CONSTR","i","TypedArrayConstructors","_typed","_redefineAll","src","_anInstance","Constructor","forbiddenField","ceil","floor","_toInteger","isNaN","min","_toLength","toInteger","_toIndex","number","toLength","RangeError","_cof","slice","_iobject","propertyIsEnumerable","cof","_defined","_toIobject","IObject","defined","max","_toAbsoluteIndex","index","_arrayIncludes","IS_INCLUDES","$this","el","fromIndex","toIObject","toAbsoluteIndex","store","push","mode","copyright","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","result","_enumBugKeys","hiddenKeys","getOwnPropertyNames","$keys","_toObject","_arrayFill","toObject","aLen","end","endPos","Symbol","USE_SYMBOL","def","TAG","_setToStringTag","tag","stat","gOPN","PROTOTYPE","WRONG_INDEX","$ArrayBuffer","$DataView","Infinity","BaseBuffer","abs","pow","log","LN2","$BUFFER","DESCRIPTORS","$LENGTH","$OFFSET","packIEEE754","mLen","nBytes","m","buffer","Array","eLen","eMax","eBias","rt","s","unpackIEEE754","nBits","NaN","unpackI32","bytes","packI8","packI16","packI32","packF64","packF32","addGetter","C","internal","view","isLittleEndian","intIndex","toIndex","_b","start","pack","reverse","set","conversion","$typed","fails","ArrayBufferProto","anInstance","keys","j","constructor","$setInt8","setInt8","getInt8","redefineAll","byteOffset","setUint8","byteLength","arrayFill","bufferLength","offset","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","setToStringTag","SPECIES","_speciesConstructor","D","_setSpecies","KEY","$isView","isView","$slice","len","first","fin","speciesConstructor","viewS","viewT","ARG","_classof","T","tryGet","callee","_iterators","ITERATOR","ArrayProto","_isArrayIter","Iterators","_objectKeys","enumBugKeys","_objectDps","defineProperties","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","appendChild","contentWindow","open","write","lt","close","_objectCreate","create","dPs","ObjectProto","_objectGpo","getPrototypeOf","core_getIteratorMethod","getIteratorMethod","classof","_isArray","isArray","arg","_arraySpeciesCreate","original","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","asc","callbackfn","res","UNSCOPABLES","_addToUnscopables","_iterStep","done","IteratorPrototype","_iterCreate","NAME","next","descriptor","BUGGY","returnThis","_iterDefine","Base","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","proto","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","values","es6_array_iterator","iterated","_t","_i","_k","step","Arguments","addToUnscopables","SAFE_CLOSING","_iterDetect","skipClosing","arr","iter","_arrayCopyWithin","copyWithin","to","from","count","inc","gOPD","getOwnPropertyDescriptor","pIE","require$$3","require$$4","require$$5","$buffer","require$$6","require$$7","require$$8","propertyDesc","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","isArrayIter","require$$21","require$$22","require$$23","require$$24","getIterFn","require$$25","require$$26","wks","require$$27","createArrayMethod","require$$28","createArrayIncludes","require$$29","require$$30","ArrayIterators","require$$31","require$$32","$iterDetect","require$$33","setSpecies","require$$34","require$$35","arrayCopyWithin","require$$36","$DP","require$$37","$GOPD","require$$38","Uint8Array","arrayForEach","arrayFilter","arraySome","arrayEvery","arrayFind","arrayFindIndex","arrayIncludes","arrayValues","arrayKeys","arrayEntries","arrayLastIndexOf","lastIndexOf","arrayReduce","reduce","arrayReduceRight","reduceRight","arrayJoin","arraySort","sort","arraySlice","arrayToString","arrayToLocaleString","toLocaleString","TYPED_CONSTRUCTOR","DEF_CONSTRUCTOR","ALL_CONSTRUCTORS","TYPED_ARRAY","$map","allocate","LITTLE_ENDIAN","Uint16Array","FORCED_SET","toOffset","BYTES","validate","speciesFromList","list","fromList","_d","$from","iterator","mapfn","mapping","iterFn","$of","TO_LOCALE_BUG","$toLocaleString","every","fill","filter","find","predicate","findIndex","forEach","indexOf","searchElement","includes","separator","map","middle","some","comparefn","subarray","begin","$begin","BYTES_PER_ELEMENT","$set","arrayLike","$iterators","isTAIndex","$getDesc","$setDesc","desc","$TypedArrayPrototype$","wrapper","CLAMPED","GETTER","SETTER","TypedArray","TAC","TypedArrayPrototype","addElement","data","v","o","getter","round","setter","$offset","$length","klass","$len","l","$nativeIterator","CORRECT_ITER_NAME","$iterator","of","init","_iterCall","ret","BREAK","RETURN","iterable","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","_validateCollection","SIZE","getEntry","entry","_f","n","k","_collectionStrong","getConstructor","ADDER","_l","forOf","clear","r","p","delete","prev","setStrong","$iterDefine","check","_setProto","setPrototypeOf","test","buggy","__proto__","_collection","common","IS_WEAK","fixMethod","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","inheritIfRequired","strong","add","getOwnPropertySymbols","$assign","assign","_objectAssign","A","K","getSymbols","gOPS","isEnum","uncaughtFrozenStore","UncaughtFrozenStore","findUncaughtFrozen","splice","_collectionWeak","$has","ufstore","InternalMap","each","weak","tmp","$WeakMap","freeze","method","rApply","Reflect","fApply","thisArgument","argumentsList","L","_invoke","args","un","factories","_bind","bind","partArgs","bound","construct","invoke","rConstruct","NEW_TARGET_BUG","ARGS_BUG","Target","newTarget","$args","propertyKey","attributes","deleteProperty","receiver","getProto","$isExtensible","_ownKeys","ownKeys","$preventExtensions","V","existingDescriptor","ownDesc","setProto","defer","channel","port","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","run","listener","event","nextTick","now","port2","port1","onmessage","postMessage","addEventListener","importScripts","cel","html","removeChild","setTimeout","_task","macrotask","Observer","MutationObserver","WebKitMutationObserver","Promise","isNode","PromiseCapability","resolve","reject","promise","$$resolve","$$reject","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","_perform","navigator","_userAgent","userAgent","task","microtask","head","last","notify","flush","parent","domain","exit","enter","standalone","then","toggle","node","createTextNode","observe","characterData","versions","v8","$Promise","empty","newPromiseCapability","newPromiseCapabilityModule","USE_NATIVE","FakePromise","PromiseRejectionEvent","isThenable","isReject","_n","chain","_c","_v","ok","_s","reaction","exited","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","error","_a","onrejectionhandled","$reject","_w","$resolve","executor","err","onFulfilled","onRejected","catch","capability","x","promiseCapability","promiseResolve","all","remaining","$index","alreadyCalled","race","_wksDefine","$Symbol","_global","charAt","wksExt","windowNames","getWindowNames","gOPNExt","$JSON","JSON","_stringify","stringify","HIDDEN","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","QObject","findChild","setSymbolDesc","$fails","_create","protoDesc","wrap","sym","isSymbol","$defineProperty","$defineProperties","symbols","enumKeys","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","es6Symbols","wellKnownSymbols","wksDefine","for","keyFor","useSetter","useSimple","replacer","$replacer","_objectSap","$freeze","$seal","$isFrozen","$isSealed","$getPrototypeOf","_sameValue","y","FProto","nameRE","match","raw","callSite","tpl","fromCharCode","$fromCodePoint","fromCodePoint","code","TO_STRING","$at","pos","charCodeAt","codePointAt","_stringRepeat","str","repeat","MATCH","_isRegexp","isRegExp","_stringContext","searchString","_failsIsRegexp","re","$startsWith","startsWith","context","search","$endsWith","endsWith","endPosition","flags","RegExp","ignoreCase","multiline","unicode","sticky","_fixReWks","SYMBOL","fns","strfn","rxfn","string","$match","regexp","REPLACE","$replace","searchValue","replaceValue","SPLIT","$split","_split","$push","NPCG","limit","separator2","lastIndex","lastLength","output","lastLastIndex","splitLimit","separatorCopy","replace","SEARCH","$search","_createProperty","createProperty","$find","forced","_isFinite","isFinite","_isInteger","isInteger","isSafeInteger","EPSILON","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","_mathLog1p","log1p","sqrt","$acosh","acosh","Number","MAX_VALUE","$asinh","asinh","$atanh","atanh","_mathSign","sign","cbrt","clz32","LOG2E","cosh","$expm1","expm1","_mathExpm1","EPSILON32","MAX32","MIN32","_mathFround","fround","$abs","$sign","hypot","value1","value2","div","sum","larg","$imul","imul","xn","yn","xl","yl","log10","LOG10E","log2","sinh","tanh","trunc","$includes","_objectToArray","isEntries","$values","getOwnPropertyDescriptors","getDesc","_stringPad","maxLength","fillString","left","stringLength","fillStr","intMaxLength","fillLen","stringFiller","padStart","$pad","padEnd","MSIE","time","boundArgs","setInterval","$task","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","Op","hasOwn","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","runtime","regeneratorRuntime","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","NativeIteratorPrototype","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","displayName","isGeneratorFunction","genFun","ctor","mark","awrap","__await","defineIteratorMethods","AsyncIterator","async","innerFn","outerFn","tryLocsList","pop","Context","reset","skipTempReset","sent","_sent","delegate","tryEntries","resetTryEntry","stop","rootRecord","completion","rval","dispatchException","exception","handle","loc","caught","record","tryLoc","hasCatch","hasFinally","catchLoc","finallyLoc","Error","abrupt","finallyEntry","complete","afterLoc","finish","thrown","delegateYield","resultName","nextLoc","protoGenerator","generator","state","doneResult","delegateResult","maybeInvokeDelegate","tryCatch","makeInvokeMethod","obj","unwrapped","previousPromise","callInvokeWithMethodAndArg","return","info","pushTryEntry","locs","iteratorMethod","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","params","evt","origPrevent","bubbles","detail","createEvent","initCustomEvent","Event","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","shift","serializeParam","encodeURIComponent","deserializeParam","decodeURIComponent","URLSearchParams","attribute","append","_this","_entries","getAll","callback","thisArg","searchArray","polyfillURLSearchParams","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","baseElement","doc","location","implementation","createHTMLDocument","anchorElement","body","protocol","attributeName","_anchorElement","linkURLWithAnchorAttribute","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","hostname","password","username","methodName","createObjectURL","blob","revokeObjectURL","polyfillURL","getOrigin","input","instanceOf","Boolean","isNullOrUndefined","isString","isNodeList","isEmpty","is$1","nullOrUndefined","boolean","function","array","weakMap","WeakMap","nodeList","element","Element","textNode","Text","keyboardEvent","KeyboardEvent","cue","TextTrackCue","VTTCue","track","TextTrack","supportsPassiveListeners","supported","options","removeEventListener","toggleListener","passive","capture","events","eventListeners","on","off","once","onceCallback","_len","_key","triggerEvent","plyr","dispatchEvent","elements","targets","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","slicedToArray","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","parts","class","toggleHidden","hidden","removeAttribute","toggleClass","force","classList","contains","hasClass","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","getElements","container","getElement","querySelector","setFocus","tabFocus","focus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","offsetHeight","range","browser","isIE","documentMode","isWebkit","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","_inputType$split","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","getAttribute","getQualityOptions","extend","player","_player$media","currentTime","paused","preload","readyState","play","load","quality","storage","cancelRequests","blankVideo","debug","dedupe","item","getDeep","path","sources","defineProperty$1","format","replaceAll","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","getHTML","innerHTML","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","classCallCheck","enabled","localStorage","getItem","json","parse","setItem","removeItem","fetch","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","prefix","content","getHours","parseInt","getMinutes","getSeconds","formatTime","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","createRange","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_this2","_ref$badge","_ref$checked","checked","aria-checked","flex","children","listeners","currentTrack","speed","parseFloat","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this4","tooltips","clientRect","getBoundingClientRect","visible","_toggle","width","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","sorting","getBadge","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","inject","_this10","props","seektime","addProperty","controlPressed","_config","labels","parseUrl","parser","buildUrlParams","setup","isVideo","isYouTube","languages","userLanguage","active","trackEvents","_captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","toConsumableArray","embed","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","urls","vimeo","sdk","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","noop","Console","onChange","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","overflow","Fullscreen","property","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","proxy","inputEvent","rect","currentTarget","hasAttribute","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","_map","deltaX","deltaY","_map2","direction","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","arg2","numWaiting","loadFiles","deps","bundleIds","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split2","padding","paddingBottom","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","Player","disableTextTrack","restorePause","setVolume","setCurrentTime","setPlaybackRate","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","h","getAspectRatio","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","snippet","currentId","posterSrc","format$$1","playerVars","hl","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackRateChange","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","adError","zIndex","destroy","_this11","handlers","_this12","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","getProviderByUrl","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","curr","closest","states","webkitPresentationMode","inline","t"],"mappings":"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","file":"plyr.polyfilled.min.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var fin = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < fin) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n if (existingDescriptor = gOPD.f(receiver, propertyKey)) {\n if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n } else dP.f(receiver, propertyKey, createDesc(0, V));\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\n origPrevent = evt.preventDefault;\n evt.preventDefault = function() {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join(\"&\");\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if(base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if(baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) { \r\n throw new Error(\"URL unable to set base \" + base + \" due to \" + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(\n event => element.style[event] !== undefined,\n );\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, hasClass, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click touchstart', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // First touch on touch devices will just show controls (if we're hiding controls)\n // If controls are shown then it'll toggle like a pointer device\n if (\n player.config.hideControls &&\n player.touch &&\n hasClass(elements.container, player.config.classNames.hideControls)\n ) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = seekTo / seek.max * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { format, stripHTML } from '../utils/strings';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { format, generateId } from '../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.4.3\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
+{"version":3,"sources":["node_modules/custom-event-polyfill/polyfill.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","node_modules/core-js/modules/_global.js","node_modules/core-js/modules/_core.js","node_modules/core-js/modules/_is-object.js","node_modules/core-js/modules/_an-object.js","node_modules/core-js/modules/_fails.js","node_modules/core-js/modules/_descriptors.js","node_modules/core-js/modules/_dom-create.js","node_modules/core-js/modules/_ie8-dom-define.js","node_modules/core-js/modules/_to-primitive.js","node_modules/core-js/modules/_object-dp.js","node_modules/core-js/modules/_property-desc.js","node_modules/core-js/modules/_hide.js","node_modules/core-js/modules/_has.js","node_modules/core-js/modules/_uid.js","node_modules/core-js/modules/_redefine.js","node_modules/core-js/modules/_export.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/_iobject.js","node_modules/core-js/modules/_is-array.js","node_modules/core-js/modules/_array-species-constructor.js","node_modules/core-js/modules/_array-species-create.js","node_modules/core-js/modules/_array-methods.js","node_modules/core-js/modules/_add-to-unscopables.js","node_modules/core-js/modules/es6.array.find.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.js","node_modules/core-js/modules/_shared-key.js","node_modules/core-js/modules/_object-keys-internal.js","node_modules/core-js/modules/_enum-bug-keys.js","node_modules/core-js/modules/_object-gopn.js","node_modules/core-js/modules/_string-ws.js","node_modules/core-js/modules/_string-trim.js","node_modules/core-js/modules/_object-keys.js","node_modules/core-js/modules/_object-dps.js","node_modules/core-js/modules/_html.js","node_modules/core-js/modules/_object-create.js","node_modules/core-js/modules/es6.number.constructor.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.keys.js","node_modules/core-js/modules/_is-regexp.js","node_modules/core-js/modules/_string-context.js","node_modules/core-js/modules/_fails-is-regexp.js","node_modules/core-js/modules/es6.string.includes.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/es6.regexp.to-string.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.iterator.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_task.js","node_modules/core-js/modules/_invoke.js","node_modules/core-js/modules/_microtask.js","node_modules/core-js/modules/_new-promise-capability.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/_perform.js","node_modules/core-js/modules/_user-agent.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.number.is-nan.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","node_modules/core-js/modules/es6.regexp.constructor.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/modules/_math-sign.js","src/js/utils/loadImage.js","node_modules/core-js/modules/es6.math.sign.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","detail","undefined","document","createEvent","initCustomEvent","call","this","Object","defineProperty","get","prototype","Event","global","iteratorSupported","Symbol","iterator","error","checkIfIteratorIsSupported","createIterator","items","next","value","shift","done","serializeParam","encodeURIComponent","replace","deserializeParam","decodeURIComponent","URLSearchParams","toString","searchString","writable","_fromString","_this","forEach","name","append","proto","_entries","push","delete","getAll","slice","has","set","callback","thisArg","entries","hasOwnProperty","i","length","keys","values","searchArray","join","enumerable","configurable","attribute","attributes","split","polyfillURLSearchParams","sort","a","b","self","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","String","baseElement","doc","location","implementation","createHTMLDocument","createElement","head","appendChild","indexOf","err","anchorElement","body","protocol","test","TypeError","search","enableSearchUpdate","enableSearchParamsUpdate","methodName","method","apply","arguments","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","defineProperties","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","port","hostname","password","username","createObjectURL","blob","revokeObjectURL","polyfillURL","getOrigin","setInterval","_aFunction","it","_ctx","fn","that","aFunction","c","module","exports","Math","Function","__g","core","version","__e","_isObject","_anObject","isObject","_fails","exec","_descriptors","require$$0","is","_domCreate","_ie8DomDefine","require$$1","require$$2","_toPrimitive","S","val","valueOf","dP","O","P","Attributes","anObject","toPrimitive","IE8_DOM_DEFINE","_propertyDesc","bitmap","_hide","object","key","f","createDesc","_has","id","px","random","_uid","concat","SRC","$toString","TPL","inspectSource","safe","isFunction","hide","$export","type","source","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","ctx","redefine","U","W","R","_export","_defined","_toObject","defined","_iterCall","ret","_iterators","store","mode","copyright","USE_SYMBOL","uid","ITERATOR","ArrayProto","Array","_isArrayIter","Iterators","ceil","floor","_toInteger","isNaN","min","_toLength","toInteger","_createProperty","index","$defineProperty","_cof","TAG","ARG","cof","_classof","T","tryGet","callee","core_getIteratorMethod","getIteratorMethod","classof","SAFE_CLOSING","_iterDetect","skipClosing","arr","iter","from","arrayLike","result","step","toObject","C","aLen","mapfn","mapping","iterFn","getIterFn","isArrayIter","toLength","createProperty","_iobject","propertyIsEnumerable","_isArray","isArray","arg","SPECIES","_arraySpeciesCreate","original","constructor","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","create","asc","$this","callbackfn","res","IObject","UNSCOPABLES","_addToUnscopables","$find","forced","find","_toIobject","gOPD","getOwnPropertyDescriptor","toIObject","pIE","check","setPrototypeOf","buggy","__proto__","_inheritIfRequired","max","_arrayIncludes","IS_INCLUDES","el","fromIndex","toAbsoluteIndex","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","_enumBugKeys","hiddenKeys","getOwnPropertyNames","$keys","_stringWs","space","spaces","ltrim","RegExp","rtrim","exporter","KEY","ALIAS","FORCE","fails","trim","string","_stringTrim","_objectKeys","enumBugKeys","_objectDps","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","src","contentWindow","open","write","lt","close","_objectCreate","dPs","gOPN","$trim","require$$3","$Number","Base","BROKEN_COF","require$$4","TRIM","toNumber","argument","third","radix","maxCode","first","charCodeAt","NaN","code","digits","l","parseInt","inheritIfRequired","require$$5","j","require$$6","MATCH","_isRegexp","isRegExp","_stringContext","NAME","_failsIsRegexp","re","includes","context","$includes","_fixReWks","SYMBOL","wks","fns","strfn","rxfn","SEARCH","$search","regexp","_flags","ignoreCase","multiline","unicode","sticky","flags","define","DESCRIPTORS","$flags","_iterStep","def","_setToStringTag","tag","stat","IteratorPrototype","_iterCreate","Constructor","descriptor","setToStringTag","ObjectProto","_objectGpo","getPrototypeOf","BUGGY","returnThis","_iterDefine","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","es6_array_iterator","iterated","_t","_i","_k","Arguments","addToUnscopables","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","$iterators","$at","TO_STRING","pos","s","charAt","point","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","getOwnPropertySymbols","$assign","assign","_objectAssign","A","K","k","getSymbols","gOPS","isEnum","_redefineAll","_anInstance","forbiddenField","BREAK","RETURN","iterable","_validateCollection","arrayFind","createArrayMethod","arrayFindIndex","uncaughtFrozenStore","_l","UncaughtFrozenStore","findUncaughtFrozen","entry","splice","_collectionWeak","getConstructor","wrapper","ADDER","anInstance","forOf","redefineAll","data","validate","$has","ufstore","InternalMap","each","weak","tmp","$WeakMap","common","IS_WEAK","fixMethod","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","$iterDetect","BUGGY_ZERO","$instance","clear","setStrong","freeze","_f","SPLIT","$split","_split","$push","NPCG","separator","limit","separator2","match","lastIndex","lastLength","output","lastLastIndex","splitLimit","separatorCopy","_objectToArray","isEntries","$values","REPLACE","$replace","searchValue","replaceValue","defer","channel","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","run","listener","args","un","invoke","nextTick","now","port2","port1","onmessage","postMessage","addEventListener","importScripts","cel","html","removeChild","setTimeout","_task","macrotask","Observer","MutationObserver","WebKitMutationObserver","Promise","isNode","PromiseCapability","resolve","reject","promise","$$resolve","$$reject","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","_perform","v","navigator","_userAgent","userAgent","_setSpecies","task","microtask","last","notify","flush","parent","domain","exit","enter","standalone","then","toggle","node","createTextNode","observe","characterData","versions","v8","$Promise","empty","newPromiseCapability","newPromiseCapabilityModule","USE_NATIVE","FakePromise","PromiseRejectionEvent","isThenable","isReject","_n","chain","_c","_v","ok","_s","reaction","exited","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","_a","onrejectionhandled","$reject","_d","_w","$resolve","executor","onFulfilled","onRejected","D","catch","r","capability","x","promiseCapability","promiseResolve","require$$7","all","remaining","$index","alreadyCalled","race","$startsWith","startsWith","number","input","instanceOf","Boolean","isNullOrUndefined","isString","isNodeList","isEmpty","is$1","nullOrUndefined","Number","boolean","function","array","weakMap","WeakMap","nodeList","element","Element","textNode","Text","keyboardEvent","KeyboardEvent","cue","TextTrackCue","VTTCue","track","TextTrack","supportsPassiveListeners","supported","options","removeEventListener","toggleListener","passive","capture","events","eventListeners","on","off","once","onceCallback","_len","_key","triggerEvent","plyr","dispatchEvent","wrap","elements","targets","reverse","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","filter","_ref","_slicedToArray","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","className","parts","class","toggleHidden","hidden","removeAttribute","toggleClass","force","map","classList","contains","hasClass","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","getElements","container","getElement","querySelector","setFocus","tabFocus","focus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","offsetHeight","range","browser","isIE","documentMode","isWebkit","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","getAttribute","getQualityOptions","extend","player","_player$media","currentTime","paused","preload","readyState","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","item","getDeep","path","reduce","obj","sources","_defineProperty","$RegExp","re1","re2","CORRECT_NEW","p","tiRE","piRE","fiU","proxy","format","replaceAll","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","getHTML","innerHTML","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","_classCallCheck","enabled","localStorage","getItem","json","JSON","parse","setItem","stringify","removeItem","fetch","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","content","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","buffer","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","button","control","createRange","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_this2","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","listeners","bind","currentTrack","speed","parseFloat","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this4","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","sorting","getBadge","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","inject","_this10","props","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","buildUrlParams","setup","isVideo","isYouTube","languages","userLanguage","active","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","_toConsumableArray","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","reset","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","urls","vimeo","sdk","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","noop","Console","onChange","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","scrollX","y","scrollY","scrollTo","overflow","viewport","property","hasProperty","cleanupViewport","part","Fullscreen","prefix","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","_mathSign","sign","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","rect","currentTarget","hasAttribute","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","abs","FProto","nameRE","$match","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","arg2","numWaiting","loadFiles","deps","bundleIds","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split2","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","h","getAspectRatio","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","snippet","currentId","posterSrc","playerVars","hl","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackRateChange","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","_this11","handlers","_this12","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","getProviderByUrl","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","closest","states","webkitPresentationMode","inline","t"],"mappings":"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","file":"plyr.polyfilled.min.js","sourcesContent":["// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\n origPrevent = evt.preventDefault;\n evt.preventDefault = function() {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if (iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams = function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { writable: true, value: {} });\r\n\r\n if (typeof searchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\r\n }\r\n } else if (searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(name, value);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if (name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for (var name in this._entries) {\r\n if (this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for (var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n if (iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n this._entries = {};\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for (var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n });\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if (!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n if (typeof URLSearchParams.prototype.sort !== 'function') {\r\n URLSearchParams.prototype.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if (typeof url !== 'string') url = String(url);\r\n\r\n // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n\r\n\r\n // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href': {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/, '');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname': {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = { 'http:': 80, 'https:': 443, 'ftp:': 21 }[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== '';\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if (!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if ((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch (e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","module.exports = {};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","exports.f = {}.propertyIsEnumerable;\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\n}\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { format, stripHTML } from '../utils/strings';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { format, generateId } from '../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.4.4\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
diff --git a/dist/plyr.svg b/dist/plyr.svg
index 3db87c38..93aa10f7 100644
--- a/dist/plyr.svg
+++ b/dist/plyr.svg
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg"><symbol id="plyr-airplay" viewBox="0 0 18 18"><path d="M16 1H2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h3v-2H3V3h12v8h-2v2h3a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1z"/><path d="M4 17h10l-5-6z"/></symbol><symbol id="plyr-captions-off" viewBox="0 0 18 18"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd" fill-opacity=".5"/></symbol><symbol id="plyr-captions-on" viewBox="0 0 18 18"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd"/></symbol><symbol id="plyr-enter-fullscreen" viewBox="0 0 18 18"><path d="M10 3h3.6l-4 4L11 8.4l4-4V8h2V1h-7zM7 9.6l-4 4V10H1v7h7v-2H4.4l4-4z"/></symbol><symbol id="plyr-exit-fullscreen" viewBox="0 0 18 18"><path d="M1 12h3.6l-4 4L2 17.4l4-4V17h2v-7H1zM16 .6l-4 4V1h-2v7h7V6h-3.6l4-4z"/></symbol><symbol id="plyr-fast-forward" viewBox="0 0 18 18"><path d="M7.875 7.171L0 1v16l7.875-6.171V17L18 9 7.875 1z"/></symbol><symbol id="plyr-muted" viewBox="0 0 18 18"><path d="M12.4 12.5l2.1-2.1 2.1 2.1 1.4-1.4L15.9 9 18 6.9l-1.4-1.4-2.1 2.1-2.1-2.1L11 6.9 13.1 9 11 11.1zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol><symbol id="plyr-pause" viewBox="0 0 18 18"><path d="M6 1H3c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1zM12 1c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1h-3z"/></symbol><symbol id="plyr-pip" viewBox="0 0 18 18"><path d="M13.293 3.293L7.022 9.564l1.414 1.414 6.271-6.271L17 7V1h-6z"/><path d="M13 15H3V5h5V3H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-6h-2v5z"/></symbol><symbol id="plyr-play" viewBox="0 0 18 18"><path d="M15.562 8.1L3.87.225C3.052-.337 2 .225 2 1.125v15.75c0 .9 1.052 1.462 1.87.9L15.563 9.9c.584-.45.584-1.35 0-1.8z"/></symbol><symbol id="plyr-restart" viewBox="0 0 18 18"><path d="M9.7 1.2l.7 6.4 2.1-2.1c1.9 1.9 1.9 5.1 0 7-.9 1-2.2 1.5-3.5 1.5-1.3 0-2.6-.5-3.5-1.5-1.9-1.9-1.9-5.1 0-7 .6-.6 1.4-1.1 2.3-1.3l-.6-1.9C6 2.6 4.9 3.2 4 4.1 1.3 6.8 1.3 11.2 4 14c1.3 1.3 3.1 2 4.9 2 1.9 0 3.6-.7 4.9-2 2.7-2.7 2.7-7.1 0-9.9L16 1.9l-6.3-.7z"/></symbol><symbol id="plyr-rewind" viewBox="0 0 18 18"><path d="M10.125 1L0 9l10.125 8v-6.171L18 17V1l-7.875 6.171z"/></symbol><symbol id="plyr-settings" viewBox="0 0 18 18"><path d="M16.135 7.784a2 2 0 0 1-1.23-2.969c.322-.536.225-.998-.094-1.316l-.31-.31c-.318-.318-.78-.415-1.316-.094a2 2 0 0 1-2.969-1.23C10.065 1.258 9.669 1 9.219 1h-.438c-.45 0-.845.258-.997.865a2 2 0 0 1-2.969 1.23c-.536-.322-.999-.225-1.317.093l-.31.31c-.318.318-.415.781-.093 1.317a2 2 0 0 1-1.23 2.969C1.26 7.935 1 8.33 1 8.781v.438c0 .45.258.845.865.997a2 2 0 0 1 1.23 2.969c-.322.536-.225.998.094 1.316l.31.31c.319.319.782.415 1.316.094a2 2 0 0 1 2.969 1.23c.151.607.547.865.997.865h.438c.45 0 .845-.258.997-.865a2 2 0 0 1 2.969-1.23c.535.321.997.225 1.316-.094l.31-.31c.318-.318.415-.781.094-1.316a2 2 0 0 1 1.23-2.969c.607-.151.865-.547.865-.997v-.438c0-.451-.26-.846-.865-.997zM9 12a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/></symbol><symbol id="plyr-volume" viewBox="0 0 18 18"><path d="M15.6 3.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4C15.4 5.9 16 7.4 16 9c0 1.6-.6 3.1-1.8 4.3-.4.4-.4 1 0 1.4.2.2.5.3.7.3.3 0 .5-.1.7-.3C17.1 13.2 18 11.2 18 9s-.9-4.2-2.4-5.7z"/><path d="M11.282 5.282a.909.909 0 0 0 0 1.316c.735.735.995 1.458.995 2.402 0 .936-.425 1.917-.995 2.487a.909.909 0 0 0 0 1.316c.145.145.636.262 1.018.156a.725.725 0 0 0 .298-.156C13.773 11.733 14.13 10.16 14.13 9c0-.17-.002-.34-.011-.51-.053-.992-.319-2.005-1.522-3.208a.909.909 0 0 0-1.316 0zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol></svg> \ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg"><symbol id="plyr-airplay"><path d="M16 1H2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h3v-2H3V3h12v8h-2v2h3a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1z"/><path d="M4 17h10l-5-6z"/></symbol><symbol id="plyr-captions-off"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd" fill-opacity=".5"/></symbol><symbol id="plyr-captions-on"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd"/></symbol><symbol id="plyr-enter-fullscreen"><path d="M10 3h3.6l-4 4L11 8.4l4-4V8h2V1h-7zM7 9.6l-4 4V10H1v7h7v-2H4.4l4-4z"/></symbol><symbol id="plyr-exit-fullscreen"><path d="M1 12h3.6l-4 4L2 17.4l4-4V17h2v-7H1zM16 .6l-4 4V1h-2v7h7V6h-3.6l4-4z"/></symbol><symbol id="plyr-fast-forward"><path d="M7.875 7.171L0 1v16l7.875-6.171V17L18 9 7.875 1z"/></symbol><symbol id="plyr-muted"><path d="M12.4 12.5l2.1-2.1 2.1 2.1 1.4-1.4L15.9 9 18 6.9l-1.4-1.4-2.1 2.1-2.1-2.1L11 6.9 13.1 9 11 11.1zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol><symbol id="plyr-pause"><path d="M6 1H3c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1zM12 1c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1h-3z"/></symbol><symbol id="plyr-pip"><path d="M13.293 3.293L7.022 9.564l1.414 1.414 6.271-6.271L17 7V1h-6z"/><path d="M13 15H3V5h5V3H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-6h-2v5z"/></symbol><symbol id="plyr-play"><path d="M15.562 8.1L3.87.225C3.052-.337 2 .225 2 1.125v15.75c0 .9 1.052 1.462 1.87.9L15.563 9.9c.584-.45.584-1.35 0-1.8z"/></symbol><symbol id="plyr-restart"><path d="M9.7 1.2l.7 6.4 2.1-2.1c1.9 1.9 1.9 5.1 0 7-.9 1-2.2 1.5-3.5 1.5-1.3 0-2.6-.5-3.5-1.5-1.9-1.9-1.9-5.1 0-7 .6-.6 1.4-1.1 2.3-1.3l-.6-1.9C6 2.6 4.9 3.2 4 4.1 1.3 6.8 1.3 11.2 4 14c1.3 1.3 3.1 2 4.9 2 1.9 0 3.6-.7 4.9-2 2.7-2.7 2.7-7.1 0-9.9L16 1.9l-6.3-.7z"/></symbol><symbol id="plyr-rewind"><path d="M10.125 1L0 9l10.125 8v-6.171L18 17V1l-7.875 6.171z"/></symbol><symbol id="plyr-settings"><path d="M16.135 7.784a2 2 0 0 1-1.23-2.969c.322-.536.225-.998-.094-1.316l-.31-.31c-.318-.318-.78-.415-1.316-.094a2 2 0 0 1-2.969-1.23C10.065 1.258 9.669 1 9.219 1h-.438c-.45 0-.845.258-.997.865a2 2 0 0 1-2.969 1.23c-.536-.322-.999-.225-1.317.093l-.31.31c-.318.318-.415.781-.093 1.317a2 2 0 0 1-1.23 2.969C1.26 7.935 1 8.33 1 8.781v.438c0 .45.258.845.865.997a2 2 0 0 1 1.23 2.969c-.322.536-.225.998.094 1.316l.31.31c.319.319.782.415 1.316.094a2 2 0 0 1 2.969 1.23c.151.607.547.865.997.865h.438c.45 0 .845-.258.997-.865a2 2 0 0 1 2.969-1.23c.535.321.997.225 1.316-.094l.31-.31c.318-.318.415-.781.094-1.316a2 2 0 0 1 1.23-2.969c.607-.151.865-.547.865-.997v-.438c0-.451-.26-.846-.865-.997zM9 12a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/></symbol><symbol id="plyr-volume"><path d="M15.6 3.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4C15.4 5.9 16 7.4 16 9c0 1.6-.6 3.1-1.8 4.3-.4.4-.4 1 0 1.4.2.2.5.3.7.3.3 0 .5-.1.7-.3C17.1 13.2 18 11.2 18 9s-.9-4.2-2.4-5.7z"/><path d="M11.282 5.282a.909.909 0 0 0 0 1.316c.735.735.995 1.458.995 2.402 0 .936-.425 1.917-.995 2.487a.909.909 0 0 0 0 1.316c.145.145.636.262 1.018.156a.725.725 0 0 0 .298-.156C13.773 11.733 14.13 10.16 14.13 9c0-.17-.002-.34-.011-.51-.053-.992-.319-2.005-1.522-3.208a.909.909 0 0 0-1.316 0zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol></svg> \ No newline at end of file
diff --git a/package.json b/package.json
index 27c45a33..0c65d92b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "plyr",
- "version": "3.4.3",
+ "version": "3.4.4",
"description": "A simple, accessible and customizable HTML5, YouTube and Vimeo media player",
"homepage": "https://plyr.io",
"author": "Sam Potts <sam@potts.es>",
diff --git a/readme.md b/readme.md
index eef18dd6..97a1765f 100644
--- a/readme.md
+++ b/readme.md
@@ -132,13 +132,13 @@ See [initialising](#initialising) for more information on advanced setups.
You can use our CDN (provided by [Fastly](https://www.fastly.com/)) for the JavaScript. There's 2 versions; one with and one without [polyfills](#polyfills). My recommendation would be to manage polyfills seperately as part of your application but to make life easier you can use the polyfilled build.
```html
-<script src="https://cdn.plyr.io/3.4.3/plyr.js"></script>
+<script src="https://cdn.plyr.io/3.4.4/plyr.js"></script>
```
...or...
```html
-<script src="https://cdn.plyr.io/3.4.3/plyr.polyfilled.js"></script>
+<script src="https://cdn.plyr.io/3.4.4/plyr.polyfilled.js"></script>
```
### CSS
@@ -152,13 +152,13 @@ Include the `plyr.css` stylsheet into your `<head>`
If you want to use our CDN (provided by [Fastly](https://www.fastly.com/)) for the default CSS, you can use the following:
```html
-<link rel="stylesheet" href="https://cdn.plyr.io/3.4.3/plyr.css">
+<link rel="stylesheet" href="https://cdn.plyr.io/3.4.4/plyr.css">
```
### SVG Sprite
The SVG sprite is loaded automatically from our CDN (provided by [Fastly](https://www.fastly.com/)). To change this, see the [options](#options) below. For
-reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/3.4.3/plyr.svg`.
+reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/3.4.4/plyr.svg`.
## Ads
diff --git a/src/js/plyr.js b/src/js/plyr.js
index a9e7a5e5..77582dd7 100644
--- a/src/js/plyr.js
+++ b/src/js/plyr.js
@@ -1,6 +1,6 @@
// ==========================================================================
// Plyr
-// plyr.js v3.4.3
+// plyr.js v3.4.4
// https://github.com/sampotts/plyr
// License: The MIT License (MIT)
// ==========================================================================
diff --git a/src/js/plyr.polyfilled.js b/src/js/plyr.polyfilled.js
index d4c76903..3fe2af1c 100644
--- a/src/js/plyr.polyfilled.js
+++ b/src/js/plyr.polyfilled.js
@@ -1,6 +1,6 @@
// ==========================================================================
// Plyr Polyfilled Build
-// plyr.js v3.4.3
+// plyr.js v3.4.4
// https://github.com/sampotts/plyr
// License: The MIT License (MIT)
// ==========================================================================